Domanda Costante delle skill (K): il suo valore?

Stato
Discussione chiusa ad ulteriori risposte.

MbutuDugongo

Utente Emerald
6 Agosto 2011
908
43
197
389
Buongiorno ragazzi, sto lavorando ad un mio progetto (precisamente un Fun-PVP) e sto mettendo mano alle skill sul database (skill proto)... In pratica so come modificare i valori dei danni eccetera, ci sono le formule e sono abbastanza chiare però mi sorge un dubbio e questo dubbio ha il nome di K (che è la costante delle skill)..
In poche parole, vi rilascio qui la formula di "Aaura della spada":

(100 + str + lv * 3)*k

Abbastanza semplice, in pratica bisogna fare questo 100 + il valore di forza che ha il pg (in questo caso il mio pg ha 145 di forza nel mio server), + il suo livello (quindi 99), tutto ciò moltiplicato x3, quindi 100+145+99x3 = 542, questo 542 finale bisogna poi moltiplicarlo per questa K, il fatto è che non so il suo valore..

Cercando su metin2 wiki ho trovato che il valore di K quando la skill è a P è di 1,25.. Ma moltiplicando questo 1,25 a 543 come risultato esce 616,25..

Fin qui direte voi nessun problema, il fatto è che sull'icona della skill di aura (quando sono in game ovviamente) mi dice che il valore d'attacco aggiuntivo è di 677, non di 616 (o 617 nel caso metin arrotondi per difetto), pensando fosse un problema del client ho controllato anche la skilltable del client che utilizzo e le formule sono identiche, sia lato client che lato DB

Quindi la mia domanda è, questa K ha davvero valore 1,25 quando le skill sono a P? E questo valore vale per tutte le skill di tutti i pg?

Ringrazio in anticipo a chi mi aiuterà :D
 
Ultima modifica:
Ciao.

char_skill.cpp:
C++:
 const float k = 1.0 * GetSkillPower(pkSk-> dwVnum) * pkSk-> bMaxLevel / 100;

Database -> Common -> Locale:
Qui vengono definiti i moltiplicatori di "k" per tipo di skill, modificarli equivale a modificare il valore che "k" avra' per quel tipo di skill.
navicat_PrNqrWrxMn.png

Infine, dalla formula che determina "k", possiamo dedurre la seguente lista di valori di default, sostituendo a GetSkillPower(pkSk-> dwVnum), il valore corrispettivo della skill:
Codice:
1:  0.05;
2:  0.06;
3:  0.08;
4:  0.10;
5:  0.12;
6:  0.14;
7:  0.16;
8:  0.18;
9:  0.20;
10: 0.22;
11: 0.24;
12: 0.26;
13: 0.28;
14: 0.30;
15: 0.32;
16: 0.34;
17: 0.36;
18: 0.38;
19: 0.40;
M1  (20): 0.50;
M2  (21): 0.52;
M3  (22): 0.54;
M4  (23): 0.56;
M5  (24): 0.58;
M6  (25): 0.60;
M7  (26): 0.63;
M8  (27): 0.66;
M9  (28): 0.69;
M10 (29): 0.72;
G1  (30): 0.82;
G2  (31): 0.85;
G3  (32): 0.88;
G4  (33): 0.91;
G5  (34): 0.94;
G6  (35): 0.98;
G7  (36): 1.02;
G8  (37): 1.06;
G9  (38): 1.10;
G10 (39): 1.15;
P   (40): 1.25;

In sintesi, si, di default il valore di "k" a P e' 1.25 per ogni tipo di skill, ma e' possibile modificarlo dalla tabella sopracitata.

Il fatto che Aura ti segni un valore diverso lato client e' dato dai seguenti files:
locale\it\skilldesc.txt e locale\it\skilltable.txt

Assicurati che entrambi abbiano la stessa formula della colonna szMasterBonusPoly.
Una volta ricompilato il client, I valori combaceranno.
 
Ultima modifica:
Ciao.

char_skill.cpp:
C++:
 const float k = 1.0 * GetSkillPower(pkSk-> dwVnum) * pkSk-> bMaxLevel / 100;

Database -> Common -> Locale:
Qui vengono definiti i moltiplicatori di "k" per tipo di skill, modificarli equivale a modificare il valore che "k" avra' per quel tipo di skill.

Infine, dalla formula che determina "k", possiamo dedurre la seguente lista di valori di default, sostituendo a GetSkillPower(pkSk-> dwVnum), il valore corrispettivo della skill:
Codice:
1:  0.05;
2:  0.06;
3:  0.08;
4:  0.10;
5:  0.12;
6:  0.14;
7:  0.16;
8:  0.18;
9:  0.20;
10: 0.22;
11: 0.24;
12: 0.26;
13: 0.28;
14: 0.30;
15: 0.32;
16: 0.34;
17: 0.36;
18: 0.38;
19: 0.40;
M1  (20): 0.50;
M2  (21): 0.52;
M3  (22): 0.54;
M4  (23): 0.56;
M5  (24): 0.58;
M6  (25): 0.60;
M7  (26): 0.63;
M8  (27): 0.66;
M9  (28): 0.69;
M10 (29): 0.72;
G1  (30): 0.82;
G2  (31): 0.85;
G3  (32): 0.88;
G4  (33): 0.91;
G5  (34): 0.94;
G6  (35): 0.98;
G7  (36): 1.02;
G8  (37): 1.06;
G9  (38): 1.10;
G10 (39): 1.15;
P   (40): 1.25;

In sintesi, si, di default il valore di "k" a P e' 1.25 per ogni tipo di skill, ma e' possibile modificarlo dalla tabella sopracitata.

Il fatto che Aura ti segni un valore diverso lato client e' dato dai seguenti files:
locale\it\skilldesc.txt e locale\it\skilltable.txt

Assicurati che entrambi abbiano la stessa formula della colonna szMasterBonusPoly.
Una volta ricompilato il client, I valori combaceranno.

Sei stato gentilissimo, grazie! Ora però ho un altro piccolo problema, ho controllato i file che mi hai detto di guardare ed effettivamente c'è un'incongruenza (nel file skilldesc.txt), ora ti allego tre immagini:




Questa è la formula presa dal file skilldesc.txt

skilldesc aura.png





Questa è la formula presa da skilltable.txt

skilltable aura.png






E questa è la formula nel DB

aura db.png


Il valore "SkillPoint" a cosa corrisponde? Avendo l'abilità a P, a quanto varrebbe? Se come hai scritto te varrebbe 40, il valore risulterebbe esagerato.. Ma ovviamente sono sicuro che il tutto non si calcola così, attendo risposte :D
 
Ultima modifica:
Sei stato gentilissimo, grazie! Ora però ho un altro piccolo problema, ho controllato i file che mi hai detto di guardare ed effettivamente c'è un'incongruenza (nel file skilldesc.txt), ora ti allego tre immagini:




Questa è la formula presa dal file skilldesc.txt

Visualizza allegato 53931





Questa è la formula presa da skilltable.txt

Visualizza allegato 53932






E questa è la formula nel DB

Visualizza allegato 53933


Il valore "SkillPoint" a cosa corrisponde? Avendo l'abilità a P, a quanto varrebbe? Se come hai scritto te varrebbe 40, il valore risulterebbe esagerato.. Ma ovviamente sono sicuro che il tutto non si calcola così, attendo risposte :D
SkillPoint e' k, semplicemente nel client si chiama SkillPoint.

L'incongruenza vera e propria e' nella formula in skilldesc.txt: come vedi, manca lo scaling del livello, per questo non ti torna in game. Dovrebbe essere:
Codice:
(100 + STR + LV*3) * SkillPoint

La lista di costanti come "LV" e "STR" per il client la trovi in PythonSkill.cpp:
C++:
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("chain"), POINT_NONE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("HR"), POINT_HIT_RATE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("LV"), POINT_LEVEL));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("Level"), POINT_LEVEL));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxHP"), POINT_MAX_HP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxSP"), POINT_MAX_SP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinMWEP"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxMWEP"), POINT_MAX_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinWEP"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxWEP"), POINT_MAX_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinATK"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxATK"), POINT_MAX_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("ATKSPD"), POINT_ATT_SPEED));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AttackPower"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AtkMin"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AtkMax"), POINT_MAX_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DefencePower"), POINT_DEF_GRADE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DEF"), POINT_DEF_GRADE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MWEP"), POINT_MAGIC_ATT_GRADE));


    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MagicAttackPower"), POINT_MAGIC_ATT_GRADE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("INT"), POINT_IQ));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("STR"), POINT_ST));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DEX"), POINT_DX));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("CON"), POINT_HT));

    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minatk"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxatk"), POINT_MAX_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minmtk"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxmtk"), POINT_MAX_WEP));

    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxhp"), POINT_MAX_HP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxsp"), POINT_MAX_SP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("odef"), POINT_DEF_GRADE));

    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minwep"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxwep"), POINT_MAX_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minmwep"), POINT_MIN_MAGIC_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxmwep"), POINT_MAX_MAGIC_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("con"), POINT_HT));


    /////


    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("atk"), POINT_MIN_ATK));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("mtk"), POINT_MIN_WEP));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("wep"), POINT_MIN_WEP));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("con"), POINT_HT));

    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("atk"), POINT_MAX_ATK));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("mtk"), POINT_MAX_WEP));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("wep"), POINT_MAX_WEP));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("con"), POINT_HT));

Come vedi, e' valido usare anche la stessa nomenclatura dello skill_proto, quindi scrivere "SkillPoint" e "k" non fa differenza e produce lo stesso risultato, sono solo due costanti di nome diverso che puntano allo stesso POINT.
 
SkillPoint e' k, semplicemente nel client si chiama SkillPoint.

L'incongruenza vera e propria e' nella formula in skilldesc.txt: come vedi, manca lo scaling del livello, per questo non ti torna in game. Dovrebbe essere:
Codice:
(100 + STR + LV*3) * SkillPoint

La lista di costanti come "LV" e "STR" per il client la trovi in PythonSkill.cpp:
C++:
SSkillData::ms_StatusNameMap.insert(make_pair(std::string("chain"), POINT_NONE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("HR"), POINT_HIT_RATE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("LV"), POINT_LEVEL));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("Level"), POINT_LEVEL));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxHP"), POINT_MAX_HP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxSP"), POINT_MAX_SP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinMWEP"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxMWEP"), POINT_MAX_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinWEP"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxWEP"), POINT_MAX_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinATK"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxATK"), POINT_MAX_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("ATKSPD"), POINT_ATT_SPEED));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AttackPower"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AtkMin"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AtkMax"), POINT_MAX_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DefencePower"), POINT_DEF_GRADE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DEF"), POINT_DEF_GRADE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MWEP"), POINT_MAGIC_ATT_GRADE));


    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MagicAttackPower"), POINT_MAGIC_ATT_GRADE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("INT"), POINT_IQ));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("STR"), POINT_ST));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DEX"), POINT_DX));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("CON"), POINT_HT));


    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minatk"), POINT_MIN_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxatk"), POINT_MAX_ATK));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minmtk"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxmtk"), POINT_MAX_WEP));


    // GUILD_SKILL_DISPLAY_BUG_FIX
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxhp"), POINT_MAX_HP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxsp"), POINT_MAX_SP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("odef"), POINT_DEF_GRADE));
    // END_OF_GUILD_SKILL_DISPLAY_BUG_FIX


    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minwep"), POINT_MIN_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxwep"), POINT_MAX_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minmwep"), POINT_MIN_MAGIC_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxmwep"), POINT_MAX_MAGIC_WEP));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
    SSkillData::ms_StatusNameMap.insert(make_pair(std::string("con"), POINT_HT));


    /////


    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("atk"), POINT_MIN_ATK));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("mtk"), POINT_MIN_WEP));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("wep"), POINT_MIN_WEP));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("con"), POINT_HT));


    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("atk"), POINT_MAX_ATK));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("mtk"), POINT_MAX_WEP));
    SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("wep"), POINT_MAX_WEP));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
    SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("con"), POINT_HT));

Come vedi, e' valido usare anche la stessa nomenclatura dello skill_proto, quindi scrivere "SkillPoint" e "k" non fa differenza e produce lo stesso risultato, sono solo due costanti di nome diverso che puntano allo stesso POINT.

Grazie ancora, sei stato davvero molto gentile! Ora.. Probabilmente mi manderai delle maledizioni MA ho fatto una cosa, ho riscritto la forma tale e quale sulla mia calcolatrice (comprese di parentesi tonde) ed effettivamente il risultato è 677, come mi dice in gioco... Io facevo senza parentesi, per quello il risultato era diverso, ma in ogni caso mi è servito sapere nuove informazioni!
 
Stato
Discussione chiusa ad ulteriori risposte.