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

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

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

MaGoth

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

Вложения

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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Daedalus:
func int b_getlearncostattribute(var C_NPC oth,var int attribut)
{
    var int kosten;
    if((attribut == ATR_STRENGTH) || (attribut == ATR_DEXTERITY) || (attribut == ATR_MANA_MAX))
    {
        if(!Npc_GetTalentSkill(other,NPC_TALENT_MAGE) && (attribut == ATR_MANA_MAX))
        {
            kosten = 2;
        }
        else
        {
            kosten = 1;
        }
    };
    return kosten;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Daedalus:
func int b_getlearncostattribute(var C_NPC oth,var int attribut)
{
    var int kosten;
    if((attribut == ATR_STRENGTH) || (attribut == ATR_DEXTERITY) || (attribut == ATR_MANA_MAX))
    {
        if(!Npc_GetTalentSkill(other,NPC_TALENT_MAGE) && (attribut == ATR_MANA_MAX))
        {
            kosten = 2;
        }
        else
        {
            kosten = 1;
        }
    };
    return kosten;
};
Соурсер ругается:
1706894808084.png

Update:
Понял. Нужно было добавить ещё одну ";" в четвертой строчке снизу.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Соурсер ругается:
нуууу)))
Яж тебе год назад говорил, что я всегда даю не полноценный код, чтобы человек сам понял что нужно доделать.
В приведенном мной коде есть одна маааааленька ошибка, найдешь? ))
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Подскажите, пожалуйста, что здесь не так?
1706895820080.png
Daedalus:
func int b_getlearncosttalent(var C_NPC oth,var int talent)
{
    var int kosten;
    if(talent == NPC_TALENT_MAGE)
    {
        kosten = 5;
    };
    if(talent == NPC_TALENT_1H)
    {
        if((slf.hitchance[NPC_TALENT_1H] - slf.hitchance[NPC_TALENT_2H]) > 50)
        {
            kosten = 2;
        }
        else
        {
            kosten = 1;
        };
    };
    if(talent == NPC_TALENT_2H)
    {
        if((slf.hitchance[NPC_TALENT_2H] - slf.hitchance[NPC_TALENT_1H]) > 50)
        {
            kosten = 2;
        }
        else
        {
            kosten = 1;
        };
    };
    if(talent == NPC_TALENT_BOW)
    {
        if(Npc_GetTalentSkill(oth,NPC_TALENT_BOW) > Npc_GetTalentSkill(oth,NPC_TALENT_CROSSBOW))
        {
            kosten = 2;
        }
        else
        {
            kosten = 1;
        };
        if(oth.guild == GIL_KDF)
        {
            kosten = kosten * 2;
        };
    };
    if(talent == NPC_TALENT_CROSSBOW)
    {
        if(Npc_GetTalentSkill(oth,NPC_TALENT_CROSSBOW) > Npc_GetTalentSkill(oth,NPC_TALENT_BOW))
        {
            kosten = 2;
        }
        else
        {
            kosten = 1;
        };
        if(oth.guild == GIL_KDF)
        {
            kosten = kosten * 2;
        };
    };
    if((talent == NPC_TALENT_PICKLOCK) || (talent == NPC_TALENT_SNEAK) || (talent == NPC_TALENT_ACROBAT) || (talent == NPC_TALENT_PICKPOCKET))
    {
        kosten = 5;
    };
    if((talent == NPC_TALENT_SMITH) || (talent == NPC_TALENT_RUNES) || (talent == NPC_TALENT_ALCHEMY) || (talent == NPC_TALENT_TAKEANIMALTROPHY))
    {
        kosten = 5;
    };
    return kosten;
};

Хотя тут всё нормально:
Daedalus:
func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    if(talent == NPC_TALENT_1H)
    {
        slf.hitchance[NPC_TALENT_1H] = slf.hitchance[NPC_TALENT_1H] + percent;
        if(slf.hitchance[NPC_TALENT_1H] >= 0)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
        };
        if(slf.hitchance[NPC_TALENT_1H] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
        };
        if(slf.hitchance[NPC_TALENT_1H] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
        };
    };
    if(talent == NPC_TALENT_2H)
    {
        slf.hitchance[NPC_TALENT_2H] = slf.hitchance[NPC_TALENT_2H] + percent;
        if(slf.hitchance[NPC_TALENT_1H] >= 0)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,0);
        };
        if(slf.hitchance[NPC_TALENT_2H] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,1);
        };
        if(slf.hitchance[NPC_TALENT_2H] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,2);
        };
    };
    if(talent == NPC_TALENT_BOW)
    {
        slf.hitchance[NPC_TALENT_BOW] = slf.hitchance[NPC_TALENT_BOW] + percent;
        if(slf.hitchance[NPC_TALENT_BOW] >= 0)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,0);
        };
        if(slf.hitchance[NPC_TALENT_BOW] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,1);
        };
        if(slf.hitchance[NPC_TALENT_BOW] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,2);
        };
    };
    if(talent == NPC_TALENT_CROSSBOW)
    {
        slf.hitchance[NPC_TALENT_CROSSBOW] = slf.hitchance[NPC_TALENT_CROSSBOW] + percent;
        if(slf.hitchance[NPC_TALENT_CROSSBOW] >= 0)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,0);
        };
        if(slf.hitchance[NPC_TALENT_CROSSBOW] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,1);
        };
        if(slf.hitchance[NPC_TALENT_CROSSBOW] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,2);
        };
    };
};
 

MEG@VOLT

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
KirTheSeeker, в таких функциях где что то там про героя используй hero то есть:

(hero.hitchance[NPC_TALENT_2H] - hero.hitchance[NPC_TALENT_1H]
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Подскажите, пожалуйста, что здесь не так?
1706986246480.png

Daedalus:
func int b_teachmagiccircle(var C_NPC slf,var C_NPC oth,var int circle)
{
    var int kosten;
    kosten = b_getlearncosttalent(oth,NPC_TALENT_MAGE);
    
    if((circle < 1) || (circle > 6))
    {
        Print("*** ОШИБКА: неправильный параметр ***");
        return FALSE;
    };
    if(circle == 1)
    {
        if(ATR_MANA_MAX < 30)
        {
            PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(hero,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(circle == 2)
    {
        if(ATR_MANA_MAX < 60)
        {
            PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(hero,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(circle == 3)
    {
        if(ATR_MANA_MAX < 90)
        {
            PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(hero,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(circle == 4)
    {
        if(ATR_MANA_MAX < 120)
        {
            PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(hero,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(circle == 5)
    {
        if(ATR_MANA_MAX < 150)
        {
            PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(hero,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(circle == 6)
    {
        if(ATR_MANA_MAX < 180)
        {
            PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(hero,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NOTENOUGHLP,-1,-1,FONT_SCREEN,2);
        b_say(hero,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    oth.lp = oth.lp - kosten;
    Npc_SetTalentSkill(hero,NPC_TALENT_MAGE,circle);
    Log_CreateTopic(TOPIC_TALENTMAGICCIRCLE,LOG_NOTE);
    b_logentry(TOPIC_TALENTMAGICCIRCLE,"Магические руны, к которым я имею доступ, подразделяются по кругам. Я не могу использовать заклинание, требующее более высокого круга, нежели изученный мной.");
    if(circle == 1)
    {
        PrintScreen(PRINT_LEARNCIRCLE_1,-1,-1,FONT_SCREEN,2);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Заклинания 1-го круга: свет, огненная стрела, малая молния, лечение легких ранений и вызов скелета гоблина.");
        return TRUE;
    };
    if(circle == 2)
    {
        PrintScreen(PRINT_LEARNCIRCLE_2,-1,-1,FONT_SCREEN,2);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Заклинания 2-го круга: огненный шар, ледяная стрела, вызов волка, кулак ветра и сон.");
        return TRUE;
    };
    if(circle == 3)
    {
        PrintScreen(PRINT_LEARNCIRCLE_3,-1,-1,FONT_SCREEN,2);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Заклинания 3-го круга: лечение средних ранений, шаровая молния, малая огненная буря, создание скелета, страх и ледяной блок.");
        return TRUE;
    };
    if(circle == 4)
    {
        PrintScreen(PRINT_LEARNCIRCLE_4,-1,-1,FONT_SCREEN,2);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Заклинания 4-го круга: молния, создание каменного голема, уничтожение нежити и большой огненный шар.");
        return TRUE;
    };
    if(circle == 5)
    {
        PrintScreen(PRINT_LEARNCIRCLE_5,-1,-1,FONT_SCREEN,2);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Заклинания 5-го круга: большая огненная буря, ледяная волна, вызов демона и лечение тяжелых ранений.");
        return TRUE;
    };
    if(circle == 6)
    {
        PrintScreen(PRINT_LEARNCIRCLE_6,-1,-1,FONT_SCREEN,2);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Заклинания 6-го круга: огненный дождь, дыхание смерти, волна смерти, армия тьмы и уменьшение монстра.");
        return TRUE;
    };
    return FALSE;
};
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.083
Благодарности
1.901
Баллы
320
Daedalus:
if(circle == 6)
    {
         if(ATR_MANA_MAX < 180)

Не хватает закрывающей фигурной скобки
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
KirTheSeeker,
в ответ на еще не опубликованный вопрос по уже возникшей ошибки:
Daedalus:
func int B_TeachmagicCircle_KTS(var C_NPC theacher,var int circle)
{

    if((circle < 1) || (circle > 6)) // герой пытается обучиться "0" кругу или 7,8,9..
    {
        Print("*** ОШИБКА: неправильный параметр ***");
        return FALSE;
    };

    // лимиты по мане
    var int ManaCircle;  ManaCircle = 30 * circle;
 
    if (hero.attribute[ATR_MANA_MAX] < ManaCircle)
    {
        PrintScreen("Не хватает маны для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(theacher,hero,"$NOLEARNNOPOINTS"); // реплику смотри в файле svm
        return FALSE;
    };

    // проверка ЛП

    var int kosten;
    kosten = b_getlearncosttalent(hero,NPC_TALENT_MAGE);
 
    if(hero.lp < kosten)
    {
        PrintScreen(PRINT_NOTENOUGHLP,-1,-1,FONT_SCREEN,2);
        b_say(theacher, hero,"$NOLEARNNOPOINTS"); // учитель говорит герою
        return FALSE;
    };
 
 
    if (!Npc_GetTalentSkill(hero,NPC_TALENT_MAGE))
    {
        Log_CreateTopic(TOPIC_TALENTMAGICCIRCLE,LOG_NOTE);
        b_logentry(TOPIC_TALENTMAGICCIRCLE,"Магические руны, к которым я имею доступ, подразделяются по кругам. Я не могу использовать заклинание, требующее более высокого круга, нежели изученный мной.");
    };
 
    hero.lp -= kosten;
    Npc_SetTalentSkill(hero,NPC_TALENT_MAGE,circle);
 
    var string txt1;    // сообщение на экране
    var string txt2;    // запись в дневник
    if (circle == 1)
    {
        txt1 = PRINT_LEARNCIRCLE_1;
        txt2 = "Заклинания 1-го круга: свет, огненная стрела, малая молния, лечение легких ранений и вызов скелета гоблина.";
    }
    else if(circle == 2)
    {
        txt1 = PRINT_LEARNCIRCLE_2;
        txt2 = "Заклинания 2-го круга: огненный шар, ледяная стрела, вызов волка, кулак ветра и сон.";
    }
    else if(circle == 3)
    {
        txt1 = PRINT_LEARNCIRCLE_3;
        txt2 = "Заклинания 3-го круга: лечение средних ранений, шаровая молния, малая огненная буря, создание скелета, страх и ледяной блок.";
    }
    else if(circle == 4)
    {
        txt1 = PRINT_LEARNCIRCLE_4;
        txt2 = "Заклинания 4-го круга: молния, создание каменного голема, уничтожение нежити и большой огненный шар.";
    }
    else if(circle == 5)
    {
        txt1 = PRINT_LEARNCIRCLE_5;
        txt2 = "Заклинания 5-го круга: большая огненная буря, ледяная волна, вызов демона и лечение тяжелых ранений.";
    }
    else if(circle == 6)
    {
        txt1 = PRINT_LEARNCIRCLE_6;
        txt2 = "Заклинания 6-го круга: огненный дождь, дыхание смерти, волна смерти, армия тьмы и уменьшение монстра.";
    };
 
    PrintScreen(txt1,-1,-1,FONT_SCREEN,2);
    b_logentry(TOPIC_TALENTMAGICCIRCLE,txt2);
 
    return TRUE;   // герой чему то научился
};


Daedalus:
func int b_teachmagiccircle(var C_NPC slf,var C_NPC oth,var int circle)
{
    return B_TeachmagicCircle_KTS(slf,circle);
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Приветствую всех вновь. Подскажите, пожалуйста, как можно добавить проверку ГГ на соответствие всем условиям для перехода на следующий уровень боевых навыков для каждого изменения силы/ловкости? Нужно добавить B_AddFighrSkill в каждую b_raiseattribute?
Чтобы уровень таланта ГГ динамически менялся не только при пограничном изменении процентов навыка, но и при изменении атрибутов.

Daedalus:
func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 50) && (slf.attribute[ATR_DEXTERITY] >= 50)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
            Mdl_ApplyOverlayMds(slf,"humans_1hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_1H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 25) && (slf.attribute[ATR_DEXTERITY] >= 25)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
            Mdl_ApplyOverlayMds(slf,"humans_1hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_1hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_1hST2.MDS");
        };
    }
    
...

};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
Чтобы уровень таланта ГГ динамически менялся не только при пограничном изменении процентов навыка, но и при изменении атрибутов.
пишешь тяжело. напиши отдельно условия, а то у тебя часто бывает что написанное тобой противоречит тому что ты хочешь.

в твоём коде у тебя навык+сила+ловкость.

если это будет касаться только героя, то так же можно вынести в отдельную эти дополнения, то есть

Daedalus:
func void B_AddFightSkillHero(var int talent,var int percent)
{
    // функция для героя


};


func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{

    if C_NpcIsHero(slf) // это герой
    {
        B_AddFightSkillHero(talent,percent);
        return;
    };
   
    ...
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
в твоём коде у тебя навык+сила+ловкость.
Именно так, т.е. уровень таланта должен меняться, когда ГГ удовлетворяет всем условиям, даже с учётом временных бонусов от оружия/украшений и т.д.
Далее отталкиваемся от приведённого примера кода для 1р:
а) Если ГГ прокачал силу и ловкость до 50, навык 1р до 55%, и экипировал меч Альрика с бонусом в 10%, то в итоге получаем соответствие всем условиям = уровень таланта меняется.
б) Если ГГ прокачал силу и ловкость до 40, навык 1р до 55%, и экипировал меч Альрика с бонусом в 10%, то в итоге условия не удовлетворяются = уровень таланта НЕ меняется.
в) Если ГГ прокачал силу до 50, ловкость до 40, навык 1р до 55%, и экипировал меч Альрика с бонусом в 10%, а затем амулет на +10 к ловкости, то в итоге все условия удовлетворяются, НО уровень таланта НЕ меняется. Если снять и надеть меч Альрика снова, то талант корректно меняется.

Вопрос - как исправить ситуацию в варианте в), чтобы уровень таланта корректно менялся не только при бонусном повышении навыка, но и при бонусном повышении атрибутов?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
KirTheSeeker, ты не туда смотришь. дело в том что при снятие одевание оружия в версии D36 у тебя будет срабатывать цепочка
ChangeTalent_Hero -> UpdateTalent_Hero -> UpdateTalent
там то и произойдёт обновление навыка у героя
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
KirTheSeeker, ты не туда смотришь. дело в том что при снятие одевание оружия в версии D36 у тебя будет срабатывать цепочка
ChangeTalent_Hero -> UpdateTalent_Hero -> UpdateTalent
там то и произойдёт обновление навыка у героя
Т.е. чтобы настроить это для мода на классику нужно перетаскивать туда всю B_NewTalentSystem ?
Или может хватить чисто UpdateTalent, ведь его нужно пихать тогда, как я понимаю, не в ChangeTalent_Hero, а в b_raiseattribute?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
KirTheSeeker, ты уже делаешь мод на классику? так ты пиши про что ты спрашиваешь. у каждой сборки свой набор скриптов.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
KirTheSeeker, ты уже делаешь мод на классику? так ты пиши про что ты спрашиваешь. у каждой сборки свой набор скриптов.
Пробую, пока время есть. Да, вопрос по скриптам классики.
Насколько понял, UpdateTalent не содержит каких-то сильно новых штук. Т.е. его можно добавить в Npc_ChangeAttribute, через которую добавляют бонусы амулеты и т.д.?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
из проекта Доси
Daedalus:
// removes and applies overlays when talent skill changed
func void UpdateOverlay(var C_Npc npc,var int oldSkill,var int newSkill,var string mds1,var string mds2)
{
    if(oldSkill == newSkill)    {        return;    };
 
    if      (oldSkill == 1)     { Mdl_RemoveOverlayMDS(npc,mds1); }
    else if (oldSkill == 2)     { Mdl_RemoveOverlayMDS(npc,mds2); };
 
    if      (newSkill == 1)     { Mdl_ApplyOverlayMds(npc,mds1); }
    else if (newSkill == 2)     { Mdl_ApplyOverlayMds(npc,mds2); };
};

Daedalus:
func void B_Npc_SetTalentSkill(var C_Npc npc,var int talent,var int newSkill)
{
    var int oldSkill;    oldSkill = Npc_GetTalentSkill(npc,talent);

    if npc.attribute[ATR_STRENGTH]  < (25*newSkill) { return;};
    if npc.attribute[ATR_DEXTERITY] < (25*newSkill) { return;};

    if (oldSkill == newSkill)                       { return;};
 
    Npc_SetTalentSkill(npc,talent,newSkill);
var string mds1;
var string mds2;
if talent == NPC_TALENT_1H
{
mds1 = "humans_1hST1.MDS";  mds2 = "humans_1hST2.MDS";
};
    UpdateOverlay(npc,oldSkill,newSkill,mds1 ,mds2 );
};

Daedalus:
// gets minimum of two numbers
func int GetMin(var int x,var int y)
{
    if(x < y)    {        return x;    };
    return y;
};
Daedalus:
func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    var int value;

    // блок по 1р
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        value = slf.HitChance[NPC_TALENT_1H];
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
    };

    // блок по 2р
    // блок по луку
    // блок по арбалету
 
    // общий блок для всех
    var int newSkill ;    newSkill = GetMin(value / 30, 2);
    B_Npc_SetTalentSkill(npc,talent,newSkill);
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
из проекта Доси
Daedalus:
// removes and applies overlays when talent skill changed
func void UpdateOverlay(var C_Npc npc,var int oldSkill,var int newSkill,var string mds1,var string mds2)
{
    if(oldSkill == newSkill)    {        return;    };
 
    if      (oldSkill == 1)     { Mdl_RemoveOverlayMDS(npc,mds1); }
    else if (oldSkill == 2)     { Mdl_RemoveOverlayMDS(npc,mds2); };
 
    if      (newSkill == 1)     { Mdl_ApplyOverlayMds(npc,mds1); }
    else if (newSkill == 2)     { Mdl_ApplyOverlayMds(npc,mds2); };
};

Daedalus:
func void B_Npc_SetTalentSkill(var C_Npc npc,var int talent,var int newSkill)
{
    var int oldSkill;    oldSkill = Npc_GetTalentSkill(npc,talent);

    if npc.attribute[ATR_STRENGTH]  < (25*newSkill) { return;};
    if npc.attribute[ATR_DEXTERITY] < (25*newSkill) { return;};

    if (oldSkill == newSkill)                       { return;};
 
    Npc_SetTalentSkill(npc,talent,newSkill);
var string mds1;
var string mds2;
if talent == NPC_TALENT_1H
{
mds1 = "humans_1hST1.MDS";  mds2 = "humans_1hST2.MDS";
};
    UpdateOverlay(npc,oldSkill,newSkill,mds1 ,mds2 );
};

Daedalus:
// gets minimum of two numbers
func int GetMin(var int x,var int y)
{
    if(x < y)    {        return x;    };
    return y;
};
Daedalus:
func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    var int value;

    // блок по 1р
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        value = slf.HitChance[NPC_TALENT_1H];
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
    };

    // блок по 2р
    // блок по луку
    // блок по арбалету
 
    // общий блок для всех
    var int newSkill ;    newSkill = GetMin(value / 30, 2);
    B_Npc_SetTalentSkill(npc,talent,newSkill);
};
Это в дополнение к func void UpdateTalent?


Или типа просто так:
Daedalus:
func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    var int value;
   
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 50) && (slf.attribute[ATR_DEXTERITY] >= 50)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
            Mdl_ApplyOverlayMds(slf,"humans_1hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_1H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 25) && (slf.attribute[ATR_DEXTERITY] >= 25)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
            Mdl_ApplyOverlayMds(slf,"humans_1hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_1hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_1hST2.MDS");
        };
    }
   
    if(talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] += percent;
        if(slf.HitChance[NPC_TALENT_2H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_2H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 80) && (slf.attribute[ATR_DEXTERITY] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,2);
            Mdl_ApplyOverlayMds(slf,"humans_2hST2.mds");
        }
        if(slf.HitChance[NPC_TALENT_2H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 40) && (slf.attribute[ATR_DEXTERITY] >= 15)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,1);
            Mdl_ApplyOverlayMds(slf,"humans_2hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_2hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_2hST2.MDS");
        };
    }
   
    else if(talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] += percent;
        if(slf.HitChance[NPC_TALENT_BOW] > 100)
        {
            slf.HitChance[NPC_TALENT_BOW] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 60) && (slf.attribute[ATR_DEXTERITY] >= 80) && (slf.attribute[ATR_STRENGTH] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_bowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 30) && (slf.attribute[ATR_DEXTERITY] >= 40) && (slf.attribute[ATR_STRENGTH] >= 15)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_bowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,0);
            Mdl_RemoveOverlayMDS(slf,"humans_bowT1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_bowT2.MDS");
        };
    }
   
    else if(talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] += percent;
        if(slf.HitChance[NPC_TALENT_CROSSBOW] > 100)
        {
            slf.HitChance[NPC_TALENT_CROSSBOW] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 60) && (slf.attribute[ATR_DEXTERITY] >= 40) && (slf.attribute[ATR_STRENGTH] >= 40)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 30) && (slf.attribute[ATR_DEXTERITY] >= 20) && (slf.attribute[ATR_STRENGTH] >= 20)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,0);
            Mdl_RemoveOverlayMDS(slf,"humans_cbowT1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_cbowT2.MDS");
        };
    };
   
    var int newSkill;
   
    newSkill = GetMin(value / 30, 2);
    B_Npc_SetTalentSkill(npc,talent,newSkill);
   
};

Но тогда не хватает параметра:
1707259393879.png
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
558
Баллы
275
Переделал скрипт вот так, поскольку иначе он не компилировался:
Код:
// gets minimum of two numbers
func int GetMin(var int x,var int y)
{
    if(x < y)
    {
        return x;
    };
    return y;
};


func void b_addfightskill(var C_NPC slf,var int talent,var int percent)
{
    var int value;
    
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 50) && (slf.attribute[ATR_DEXTERITY] >= 50)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
            Mdl_ApplyOverlayMds(slf,"humans_1hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_1H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 25) && (slf.attribute[ATR_DEXTERITY] >= 25)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
            Mdl_ApplyOverlayMds(slf,"humans_1hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_1hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_1hST2.MDS");
        };
    };
    
    if(talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] += percent;
        if(slf.HitChance[NPC_TALENT_2H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_1H] < 0)
        {
            slf.HitChance[NPC_TALENT_1H] = 0;
        };
        if(slf.HitChance[NPC_TALENT_2H] >= 60) && (slf.attribute[ATR_STRENGTH] >= 80) && (slf.attribute[ATR_DEXTERITY] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,2);
            Mdl_ApplyOverlayMds(slf,"humans_2hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_2H] >= 30) && (slf.attribute[ATR_STRENGTH] >= 40) && (slf.attribute[ATR_DEXTERITY] >= 15)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,1);
            Mdl_ApplyOverlayMds(slf,"humans_2hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,0);
            Mdl_RemoveOverlayMDS(slf,"humans_2hST1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_2hST2.MDS");
        };
    };
    
    if(talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] += percent;
        if(slf.HitChance[NPC_TALENT_BOW] > 100)
        {
            slf.HitChance[NPC_TALENT_BOW] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 60) && (slf.attribute[ATR_DEXTERITY] >= 80) && (slf.attribute[ATR_STRENGTH] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_bowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 30) && (slf.attribute[ATR_DEXTERITY] >= 40) && (slf.attribute[ATR_STRENGTH] >= 15)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_bowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,0);
            Mdl_RemoveOverlayMDS(slf,"humans_bowT1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_bowT2.MDS");
        };
    };
    
    if(talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] += percent;
        if(slf.HitChance[NPC_TALENT_CROSSBOW] > 100)
        {
            slf.HitChance[NPC_TALENT_CROSSBOW] = 100;
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 60) && (slf.attribute[ATR_DEXTERITY] >= 40) && (slf.attribute[ATR_STRENGTH] >= 40)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 30) && (slf.attribute[ATR_DEXTERITY] >= 20) && (slf.attribute[ATR_STRENGTH] >= 20)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,0);
            Mdl_RemoveOverlayMDS(slf,"humans_cbowT1.MDS");
            Mdl_RemoveOverlayMDS(slf,"humans_cbowT2.MDS");
        };
    };
    
    var int newSkill;
    
    newSkill = GetMin(value / 30, 2);
    Npc_SetTalentSkill(slf,talent,newSkill);
    
};

Но ситуация не изменилась. Разве что теперь, при смене овер-лея, не меняется название уровня таланта в меню статистики (остаётся "Новичок", хотя сами анимации изменились).
Что я сделал не так?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.002
Благодарности
971
Баллы
295
Что я сделал не так?
не знаю. как по мне вся задумка "не так", так как не учитывает игровой механики классики.

Daedalus:
instance PC_HERO(NPC_DEFAULT)
{
    name[0] = "Я";
    guild = GIL_NONE;
    id = 0;
    voice = 15;
    level = 0;
    npctype = NPCTYPE_MAIN;
    bodystateinterruptableoverride = TRUE;
    exp = 0;
    exp_next = 500;
    lp = 0;
    attribute[ATR_STRENGTH] = 10;
    attribute[ATR_DEXTERITY] = 10;
    attribute[ATR_MANA_MAX] = 10;
    attribute[ATR_MANA] = 10;
    attribute[ATR_HITPOINTS_MAX] = 40;
    attribute[ATR_HITPOINTS] = 40;
    Mdl_SetVisual(self,"HUMANS.MDS");
    Mdl_SetVisualBody(self,"hum_body_Naked0",BODYTEX_PLAYER_G2,0,"Hum_Head_Pony",FACE_N_PLAYER,0,NO_ARMOR);
 
    b_setfightskills(self,10);
 
    /*
    HitChance[NPC_TALENT_1H]       = 10;
    HitChance[NPC_TALENT_2H]       = 10;
    HitChance[NPC_TALENT_BOW]      = 10;
    HitChance[NPC_TALENT_CROSSBOW] = 10;
    */
 
    //-------- Talente --------
    Npc_SetTalentSkill(self,NPC_TALENT_1H,0);
    Npc_SetTalentSkill(self,NPC_TALENT_2H,0);
    Npc_SetTalentSkill(self,NPC_TALENT_BOW,0);
    Npc_SetTalentSkill(self,NPC_TALENT_CROSSBOW,0);
};
 

Вложения

  • b_addfightskill.zip
    1,4 KB · Просмотры: 5
Последнее редактирование:
Сверху Снизу