Open Kor-Angar opened 4 years ago
if(other.HitChance[NPC_TALENT_1H] >= (other.HitChance[NPC_TALENT_2H] + 30)) // бонусы и штраф работает
это я с Мечём Альрика сегодня пробовал. качал до 1р до 30, потом одевал меч на +10, 1р становился 40 и при дальнейшей прокачке срабатывал скрипт. прокачивался и 1р и 2р одновременно.
вот это описание идёт из Готики 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 классик?
а есть авторский код B_TeachFightTalentPercent.d из Готики 2 классик?
Актуально ли всё это с новой системой обучения?
вроде да. это же другой фрагмент кода
вот тут в коде идёт проверка на разницу в таланте после того как талант уже поднялся
я уже писал когда то давно что данный алгоритм работает некорректно, т.к. сначало поднимает навык, а только потом смотрит какая разница. в таком случае при разнице в навыке=25 при поднятие навыка на 5 сработает скрипт(25+5=30), а при поднятие на 1 не сработает(25+1=26).
правильнее было, если бы сначала была проверка, а потом навык поднимался.
в таком случае скрипт будет работать одинаково вне зависимости на сколько поднимает герой навык на 1 или на 5.
на видео видно. в начале видео я качаю 1р и разница в навыке 30 сохраняется. а потом я качаю 2р и видно что скрипт срабатывает то так, то эдак :- ) https://www.youtube.com/watch?v=k9VnmEN9VkU