nie wiem po co tracisz czas na testowanie rzeczy które są w kodzie gry jasno opisane
asgota lub jego developer powinni doskonale wiedzieć o czym mówie
w core są odpowiednie matematyczne wzory zależne od twojego m.ataku i m.defu przeciwnika, różnicy lvlu twojego i przeciwnika, lub różnicy mlvlu debuffa a lvlem przeciwnika (dla większości debuffów, które mają takie zależności są odpowiednie linijki w kodzie łatwym do edycji plików)
dam tu przykład dla niewtajemniczonych, wzięty z plików h5, parę rzeczy jest innych (nowszych), ale zasada pozostaje ta sama
<skill id="1201" levels="33" name="Dryad Root" enchantGroup1="1" enchantGroup2="1"> <table name="#magicLvl"> 23 24 25 28 29 30 33 34 35 38 39 40 42 43 44 46 47 48 50 51 52 54 55 56 58 60 62 64 66 68 70 72 74 </table> <set name="isDebuff" val="true" /> <set name="isMagic" val="1" /> <!-- Magic Skill --> <set name="magicLvl" val="#magicLvl" /> <set name="power" val="80" /> <!-- Base Land Rate --> <set name="offensive" val="true" /> <set name="basicProperty" val="MEN" /> <set name="skillType" val="ROOT" /> <set name="trait" val="HOLD" /> <set name="lvlBonusRate" val="2" /> <for> <effect name="Root" abnormalTime="30" val="0" abnormalLvl="1" abnormalType="root_magically" /> </for> </skill> |
pierwsze pogrubienie magic lvl czaru, drugie pogrubienie, czy to magiczny skill czy fizyczny, trzecie pogrubienie szansa wejścia bazowa, czwarte pogrubienie od czego ma zależeć dodatkowa ochrona przed danym debuffem (w tym przypadku men, większy men większa szansa resistu), piąte pogrubienie, z jakiej grupy debuffów jest dany skill, mamy root/silence/paralyze/bleed/itp, ostatnie pogrubienie, mnożnik różnicy lvli
teraz zobaczmy jak to wygląda w core (w mojej wersji z h5, większość uproszcze by było zrozumiałe)
if (skill.isMagic())
{
mAtkModifier = target.getMDef(target, skill);
if (shld == SHIELD_DEFENSE_SUCCEED)
mAtkModifier += target.getShldDef();
// Add Bonus for Sps/SS
if (bss)
ssModifier = 4;
else if (sps)
ssModifier = 2;
else
ssModifier = 1;
mAtkModifier = 14 * Math.sqrt(ssModifier * attacker.getMAtk(target, skill)) / mAtkModifier;
rate = (int) (rate * mAtkModifier);
}
CZYLI: zanim rzeczy jak mental shield itp zostaną rzucone, jeżeli debuff jest magiczny (czyli bierze pod uwage mdef):
14 * pierwiastek z(mnożnik jakie ssy używamy * nasz m.atak) / podzielić na mdef przeciwnika
wtedy szansa na wejście np. roota wychodzi:
rate = (int) (rate * mAtkModifier);
bazowy landrate (podany w skillu, czyli 80) * wynik z powyższego
do tego dochodzi różnica lvlowa mnożona razy 2 (jak podano w skillu) przy wzorze na szanse:
public static int calcLvlDependModifier(L2Character attacker, L2Character target, L2Skill skill)
{
if (skill.getLevelDepend() == 0)
return 0;
final int attackerMod;
if (skill.getMagicLevel() > 0)
attackerMod = skill.getMagicLevel();
else
attackerMod = attacker.getLevel();
return skill.getLevelDepend() * (attackerMod - target.getLevel());
}
jeżeli skill jest magiczny, liczy się różnica między magicznym lvlem skilla a lvlem przeciwnika, w innym przypadku level postaci rzucającej skilla (np takiego bleeda, sam lvl skilla nie jest ważny), do tego mnożone przez mnożnik różnicy, czyli w przypadku roota x2
czyli 2 * (74-79) = -10 - CZYLI -10% szansy jeżeli nieenchantowany root jest rzucany na przeciwnika lvl 79
do tego dochodzą limity szans na wejście debuffów (nie wiem jak jest w przypadku interlude, na h5 jest każdy debuff ma minimum 10% na wejście, maximum 90%)
wróćmy jednak do głównego kalkulatora szansy wejścia debuffów
14 * pierwiastek z(mnożnik jakie ssy używamy * nasz m.atak) / podzielić na mdef przeciwnika
nasz m atak i mnożnik ssu jest pod pierwiastkiem, więc szansa wzrasta dwukrotnie przy czterokrotnym wzroście m.ataku, jako że pierwiastek z 400 to 20, a pierwiastek z 1600 to 40, m atak wzrasta 4 krotnie, za to mnożnik tylko dwukrotnie
jeszcze raz powtórze, to są wzory pod h5, które mogą różnić się od interlude, tym bardziej zależy jaką wersję plików ma serwer, ale jeżeli asgota ma dostęp do core powinien mieć dojście do wzorów na szansę debuffów