dosinabox / g2nr_unofficial_update

Исходники скриптов, релизы, хотфиксы и тестовые версии неофициального обновления для игры "Готика 2: Ночь Ворона".
https://worldofplayers.ru/threads/36817
The Unlicense
15 stars 1 forks source link

PRINT_Learn1H_and_2H и PRINT_LearnBow_and_Crossbow #206

Open Kor-Angar opened 4 years ago

Kor-Angar commented 4 years ago

вот тут в коде идёт проверка на разницу в таланте после того как талант уже поднялся

if(talent == NPC_TALENT_1H)
        {
            B_RaiseFightTalent(oth,NPC_TALENT_1H,percent);
            if(oth.aivar[REAL_TALENT_1H] >= (oth.aivar[REAL_TALENT_2H] + 30))
            {
                B_RaiseFightTalent(oth,NPC_TALENT_2H,percent);
                PrintScreen(PRINT_Learn1H_and_2H,-1,-1,FONT_Screen,2);
            }
            else
            {
                PrintScreen(PRINT_Learn1H,-1,-1,FONT_Screen,2);
            };
            return TRUE;
        };

я уже писал когда то давно что данный алгоритм работает некорректно, т.к. сначало поднимает навык, а только потом смотрит какая разница. в таком случае при разнице в навыке=25 при поднятие навыка на 5 сработает скрипт(25+5=30), а при поднятие на 1 не сработает(25+1=26).


правильнее было, если бы сначала была проверка, а потом навык поднимался.

if(talent == NPC_TALENT_1H)
{
    if(other.HitChance[NPC_TALENT_1H] >= (other.HitChance[NPC_TALENT_2H] + 30))  // бонус и штраф работает
//  if(oth.aivar[REAL_TALENT_1H] >= (oth.aivar[REAL_TALENT_2H] + 30)) // бонус и штраф невлияет
    {
            B_RaiseFightTalent(oth,NPC_TALENT_1H,percent);
        B_RaiseFightTalent(oth,NPC_TALENT_2H,percent);
        PrintScreen(PRINT_Learn1H_and_2H,-1,-1,FONT_Screen,2);
    }
    else
    {
        B_RaiseFightTalent(oth,NPC_TALENT_1H,percent);
        PrintScreen(PRINT_Learn1H,-1,-1,FONT_Screen,2);
    };
    return TRUE;
};

в таком случае скрипт будет работать одинаково вне зависимости на сколько поднимает герой навык на 1 или на 5.


на видео видно. в начале видео я качаю 1р и разница в навыке 30 сохраняется. а потом я качаю 2р и видно что скрипт срабатывает то так, то эдак :- ) https://www.youtube.com/watch?v=k9VnmEN9VkU

Kor-Angar commented 4 years ago

if(other.HitChance[NPC_TALENT_1H] >= (other.HitChance[NPC_TALENT_2H] + 30)) // бонусы и штраф работает

это я с Мечём Альрика сегодня пробовал. качал до 1р до 30, потом одевал меч на +10, 1р становился 40 и при дальнейшей прокачке срабатывал скрипт. прокачивался и 1р и 2р одновременно.

Kor-Angar commented 4 years ago

вот это описание идёт из Готики 2 классик "Kosten abhдngig von "verwandtem" Waffentalent-Level"

теперь стало понятно почему проверка идёт после "прокачки навыка". описание работы из Готике 2 классик, а в ней снимали опыт и за прокачку 1р и за прокачку 2р. Пример

прокачка 1р за 5 ЛП
если 1р > 2р +x
то прокачка 2р за 5 ЛП.

соответственно в Готике 2 классик можно было как качать два навыка одновременно, через этот скрипт по двойной цене или каждый по отдельности за обычную цену. но в итоге что так что это эдак уходило одинаковое кол-во опыта. и получалось что у героя соблюдалась взаимосвязь навык и что бы стать "мастер" двуручного(Npc_SetTalentSkill (slf, NPC_TALENT_2H, 2)), надо было иметь "боец" одноручного (Npc_SetTalentSkill (slf, NPC_TALENT_1H, 1)).


в Готике 2 НВ система прокачки поменялась и опыт снимают только за прокачку 1р навыка

прокачка 1р за 10 ЛП
если 1р > 2р +x
то прокачка 2р за 0 ЛП.

оттого и скрипт стал срабатывать некорректно :-) точнее ЛП расходоваться при разных условиях по разному;-)

// ***************************************************
// B_TeachFightTalentPercent
// -------------------------
// Kosten abhдngig von "verwandtem" Waffentalent-Level
// ***************************************************

// -------------------------------
func int B_TeachFightTalentPercent (var C_NPC slf, var C_NPC oth, var int talent, var int percent, var int teacherMAX)
{
    var string concatText;

    // ------ Kostenberechnung ------
    var int kosten; 
    kosten = (B_GetLearnCostTalent(oth, talent, 1) * percent);

    //EXIT IF...

    // ------ falscher Parameter ------
    if (talent!=NPC_TALENT_1H) && (talent!=NPC_TALENT_2H) && (talent!=NPC_TALENT_BOW) && (talent!=NPC_TALENT_CROSSBOW)
    {
        Print ("*** ERROR: Wrong Parameter ***");
        return FALSE;
    };

    // ------ Lernen NICHT ьber teacherMax ------
    var int realHitChance;
    if      (talent == NPC_TALENT_1H)       {   realHitChance = oth.HitChance[NPC_TALENT_1H];       }   // Umwandeln von const-Parameter in VAR fьr folgende If-Abfrage
    else if (talent == NPC_TALENT_2H)       {   realHitChance = oth.HitChance[NPC_TALENT_2H];       }
    else if (talent == NPC_TALENT_BOW)      {   realHitChance = oth.HitChance[NPC_TALENT_BOW];      }
    else if (talent == NPC_TALENT_CROSSBOW) {   realHitChance = oth.HitChance[NPC_TALENT_CROSSBOW]; };

    if (realHitChance >= teacherMAX)
    {
        concatText = ConcatStrings (PRINT_NoLearnOverPersonalMAX, IntToString(teacherMAX));
        PrintScreen (concatText, -1, -1, FONT_SCREEN, 2);
        B_Say (slf, oth, "$NOLEARNYOUREBETTER");

        return FALSE;
    };

    if ((realHitChance + percent) > teacherMAX)
    {
        concatText = ConcatStrings (PRINT_NoLearnOverPersonalMAX, IntToString(teacherMAX));
        PrintScreen (concatText, -1, -1, FONT_SCREEN, 2);
        B_Say (slf, oth, "$NOLEARNOVERPERSONALMAX");

        return FALSE;
    };

    // ------ Player hat zu wenig Lernpunkte ------
    if (oth.lp < kosten)
    {
        PrintScreen (PRINT_NotEnoughLP, -1, -1, FONT_Screen, 2);
        B_Say (slf, oth, "$NOLEARNNOPOINTS");

        return FALSE;
    };

    // FUNC

    // ------ Lernpunkte abziehen ------            
    oth.lp = oth.lp - kosten;

    // ------ 1H steigern ------
    if (talent == NPC_TALENT_1H)            
    {   
        B_RaiseFightTalent (oth, NPC_TALENT_1H, percent);   //Einhand steigern

        if (oth.aivar[REAL_TALENT_1H] >= (oth.aivar[REAL_TALENT_2H] + 30))
        {
            B_RaiseFightTalent (oth, NPC_TALENT_2H, percent);   //Zweihand mit hochziehen
            PrintScreen (PRINT_Learn1H_and_2H, -1, -1, FONT_Screen, 2);
        }
        else
        {
            PrintScreen (PRINT_Learn1H, -1, -1, FONT_Screen, 2);
        };

        return TRUE;
    };

а есть авторский код B_TeachFightTalentPercent.d из Готики 2 классик?

Kor-Angar commented 4 years ago

а есть авторский код B_TeachFightTalentPercent.d из Готики 2 классик?

Классика НВ
imagehttps://github.com/dosinabox/g2_classic/blob/master/PrjGothic/Story/B_Story/b_teachfighttalentpercent.d image https://github.com/dosinabox/g2nr_unofficial_update/blob/master/PrjGOTHIC/Story/B_Story/B_TeachFightTalentPercent.d
dosinabox commented 3 years ago

Актуально ли всё это с новой системой обучения?

Kor-Angar commented 3 years ago

вроде да. это же другой фрагмент кода