For any feedback about the site feel free to dm me on Discord at weghuz#1978. I hang around in the DFK discord a lot, you can find me in the hero and price discussion channels.
You can find my most recent analysis of how I use formulas to analyse heroes in DFK here. This is what makes up the "Class Score" I use on this site. You can also find the code in the below section.
The "Growth Score" is a growth based score. It's based on a heroes Stat Growth Values. A medium article about it will come out at some point and then get linked in this section. For now you can find the code that's used below. It's all Javascript.
function ClassScore(hero) { let r1 = RemoveBase(hero); let r2 = RemoveAverageLevels(r1); let r3 = MultiplyBaseByGrowth(r2); return SumStats(r3); } function RemoveBase(hero) { let returnHero = Object.assign({}, hero); returnHero.strength = hero.strength - classVars[hero.mainClass].base.str; returnHero.dexterity = hero.dexterity - classVars[hero.mainClass].base.dex; returnHero.agility = hero.agility - classVars[hero.mainClass].base.agi; returnHero.vitality = hero.vitality - classVars[hero.mainClass].base.vit; returnHero.endurance = hero.endurance - classVars[hero.mainClass].base.end; returnHero.intelligence = hero.intelligence - classVars[hero.mainClass].base.int; returnHero.wisdom = hero.wisdom - classVars[hero.mainClass].base.wis; returnHero.luck = hero.luck - classVars[hero.mainClass].base.lck; return returnHero; } function RemoveAverageLevels(hero) { let returnHero = Object.assign({}, hero); returnHero.strength = hero.strength - classVars[hero.mainClass].growth.str * (hero.level - 1); returnHero.dexterity = hero.dexterity - classVars[hero.mainClass].growth.dex * (hero.level - 1); returnHero.agility = hero.agility - classVars[hero.mainClass].growth.agi * (hero.level - 1); returnHero.vitality = hero.vitality - classVars[hero.mainClass].growth.vit * (hero.level - 1); returnHero.endurance = hero.endurance - classVars[hero.mainClass].growth.end * (hero.level - 1); returnHero.intelligence = hero.intelligence - classVars[hero.mainClass].growth.int * (hero.level - 1); returnHero.wisdom = hero.wisdom - classVars[hero.mainClass].growth.wis * (hero.level - 1); returnHero.luck = hero.luck - classVars[hero.mainClass].growth.lck * (hero.level - 1); return returnHero; } function MultiplyBaseByGrowth(hero) { let returnHero = Object.assign({}, hero); returnHero.strength = hero.strength * classVars[hero.mainClass].growth.str; returnHero.dexterity = hero.dexterity * classVars[hero.mainClass].growth.dex; returnHero.agility = hero.agility * classVars[hero.mainClass].growth.agi; returnHero.vitality = hero.vitality * classVars[hero.mainClass].growth.vit; returnHero.endurance = hero.endurance * classVars[hero.mainClass].growth.end; returnHero.intelligence = hero.intelligence * classVars[hero.mainClass].growth.int; returnHero.wisdom = hero.wisdom * classVars[hero.mainClass].growth.wis; returnHero.luck = hero.luck * classVars[hero.mainClass].growth.lck; return returnHero; } function SumStats(hero) { let sum = 0; sum += hero.strength ; sum += hero.dexterity ; sum += hero.agility ; sum += hero.vitality ; sum += hero.endurance ; sum += hero.intelligence; sum += hero.wisdom ; sum += hero.luck; return sum.toFixed(2); }
const rarityBonus = [0, 2, 4, 7, 10]; function GrowthScore(hero) { GrowthsToRealNumbers(hero); let r1 = RemoveBaseGrowth(hero) let r2 = AddRarityGrowth(r1); let r3 = SumPandSGrowth(r2); let r4 = MultiplyGrowthByBaseGrowth(r3); let score = SumGrowth(r4); return score; } function GrowthsToRealNumbers(hero) { hero.strengthGrowthP /= 10000; hero.dexterityGrowthP /= 10000; hero.agilityGrowthP /= 10000; hero.vitalityGrowthP /= 10000; hero.enduranceGrowthP /= 10000; hero.intelligenceGrowthP /= 10000; hero.wisdomGrowthP /= 10000; hero.luckGrowthP /= 10000; hero.strengthGrowthS /= 10000; hero.dexterityGrowthS /= 10000; hero.agilityGrowthS /= 10000; hero.vitalityGrowthS /= 10000; hero.enduranceGrowthS /= 10000; hero.intelligenceGrowthS /= 10000; hero.wisdomGrowthS /= 10000; hero.luckGrowthS /= 10000; return hero; } function RemoveBaseGrowth(hero) { let returnHero = Object.assign({}, hero); returnHero.strengthGrowthP = hero.strengthGrowthP - classVars[hero.mainClass].growth.str; returnHero.dexterityGrowthP = hero.dexterityGrowthP - classVars[hero.mainClass].growth.dex; returnHero.agilityGrowthP = hero.agilityGrowthP - classVars[hero.mainClass].growth.agi; returnHero.vitalityGrowthP = hero.vitalityGrowthP - classVars[hero.mainClass].growth.vit; returnHero.enduranceGrowthP = hero.enduranceGrowthP - classVars[hero.mainClass].growth.end; returnHero.intelligenceGrowthP = hero.intelligenceGrowthP - classVars[hero.mainClass].growth.int; returnHero.wisdomGrowthP = hero.wisdomGrowthP - classVars[hero.mainClass].growth.wis; returnHero.luckGrowthP = hero.luckGrowthP - classVars[hero.mainClass].growth.lck; return returnHero; } function AddRarityGrowth(hero) { let returnHero = Object.assign({}, hero); let bonus = rarityBonus[hero.rarity]; let statBonus = bonus / 40; returnHero.strengthGrowthP = hero.strengthGrowthP + statBonus; returnHero.dexterityGrowthP = hero.dexterityGrowthP + statBonus; returnHero.agilityGrowthP = hero.agilityGrowthP + statBonus; returnHero.vitalityGrowthP = hero.vitalityGrowthP + statBonus; returnHero.enduranceGrowthP = hero.enduranceGrowthP + statBonus; returnHero.intelligenceGrowthP = hero.intelligenceGrowthP + statBonus; returnHero.wisdomGrowthP = hero.wisdomGrowthP + statBonus; returnHero.luckGrowthP = hero.luckGrowthP + statBonus; return returnHero; } function SumPandSGrowth(hero) { let returnHero = Object.assign({}, hero); returnHero.strengthGrowthP += hero.strengthGrowthS; returnHero.dexterityGrowthP += hero.dexterityGrowthS; returnHero.agilityGrowthP += hero.agilityGrowthS; returnHero.vitalityGrowthP += hero.vitalityGrowthS; returnHero.enduranceGrowthP += hero.enduranceGrowthS; returnHero.intelligenceGrowthP += hero.intelligenceGrowthS; returnHero.wisdomGrowthP += hero.wisdomGrowthS; returnHero.luckGrowthP += hero.luckGrowthS; return returnHero; } function MultiplyGrowthByBaseGrowth(hero) { let returnHero = Object.assign({}, hero); returnHero.strengthGrowthP = hero.strengthGrowthP * classVars[hero.mainClass].growth.str; returnHero.dexterityGrowthP = hero.dexterityGrowthP * classVars[hero.mainClass].growth.dex; returnHero.agilityGrowthP = hero.agilityGrowthP * classVars[hero.mainClass].growth.agi; returnHero.vitalityGrowthP = hero.vitalityGrowthP * classVars[hero.mainClass].growth.vit; returnHero.enduranceGrowthP = hero.enduranceGrowthP * classVars[hero.mainClass].growth.end; returnHero.intelligenceGrowthP = hero.intelligenceGrowthP * classVars[hero.mainClass].growth.int; returnHero.wisdomGrowthP = hero.wisdomGrowthP * classVars[hero.mainClass].growth.wis; returnHero.luckGrowthP = hero.luckGrowthP * classVars[hero.mainClass].growth.lck; return returnHero; } function SumGrowth(hero) { let sum = 0; sum += hero.strengthGrowthP ; sum += hero.dexterityGrowthP ; sum += hero.agilityGrowthP ; sum += hero.vitalityGrowthP ; sum += hero.enduranceGrowthP ; sum += hero.intelligenceGrowthP ; sum += hero.wisdomGrowthP ; sum += hero.luckGrowthP; switch (hero.mainClass) { case 'DarkKnight': case 'Ninja': case 'Paladin': case 'Summoner': sum = sum * 1.14285; break; case 'Dragoon': case 'Sage': sum = sum * 1.33334; break case 'DreadKnight': sum = sum * 1.6; break; default: break; } return sum; }
var classVars = { "Warrior": { growth: { str: .75, dex: .7, agi: .5, vit: .65, end: .65, int: .2, wis: .2, lck: .2 }, base: { str: 11, dex: 8, agi: 7, vit: 9, end: 8, int: 5, wis: 5, lck: 7 } }, "Knight": { growth: { str: .7, dex: .55, agi: .45, vit: .75, end: .75, int: .2, wis: .25, lck: .35 }, base: { str: 10, dex: 6, agi: 6, vit: 10, end: 10, int: 5, wis: 6, lck: 7 } }, "Thief": { growth: { str: .55, dex: .55, agi: .7, vit: .5, end: .45, int: .25, wis: .35, lck: .65 }, base: { str: 7, dex: 8, agi: 10, vit: 6, end: 6, int: 6, wis: 7, lck: 10 } }, "Archer": { growth: { str: .55, dex: .8, agi: .5, vit: .5, end: .6, int: .4, wis: .25, lck: .4 }, base: { str: 7, dex: 12, agi: 7, vit: 6, end: 7, int: 7, wis: 6, lck: 8 } }, "Priest": { growth: { str: .3, dex: .3, agi: .4, vit: .5, end: .6, int: .7, wis: .8, lck: .4 }, base: { str: 5, dex: 6, agi: 6, vit: 6, end: 7, int: 10, wis: 13, lck: 7 } }, "Wizard": { growth: { str: .3, dex: .3, agi: .4, vit: .5, end: .5, int: .8, wis: .8, lck: .4 }, base: { str: 5, dex: 6, agi: 6, vit: 6, end: 6, int: 12, wis: 12, lck: 7 } }, "Monk": { growth: { str: .6, dex: .6, agi: .6, vit: .6, end: .55, int: .25, wis: .5, lck: .3 }, base: { str: 8, dex: 8, agi: 8, vit: 8, end: 8, int: 6, wis: 8, lck: 6 } }, "Pirate": { growth: { str: .7, dex: .7, agi: .5, vit: .6, end: .55, int: .2, wis: .2, lck: .55 }, base: { str: 9, dex: 9, agi: 7, vit: 8, end: 7, int: 5, wis: 5, lck: 10 } }, "Paladin": { growth: { str: .8, dex: .4, agi: .35, vit: .8, end: .8, int: .3, wis: .65, lck: .4 }, base: { str: 10, dex: 6, agi: 6, vit: 10, end: 10, int: 6, wis: 10, lck: 7 } }, "DarkKnight": { growth: { str: .85, dex: .55, agi: .35, vit: .75, end: .6, int: .7, wis: .35, lck: .35 }, base: { str: 14, dex: 7, agi: 6, vit: 11, end: 7, int: 8, wis: 6, lck: 6 } }, "Summoner": { growth: { str: .45, dex: .45, agi: .5, vit: .5, end: .5, int: .85, wis: .85, lck: .4 }, base: { str: 6, dex: 7, agi: 7, vit: 6, end: 6, int: 14, wis: 12, lck: 7 } }, "Ninja": { growth: { str: .5, dex: .75, agi: .85, vit: .5, end: .4, int: .5, wis: .4, lck: .6 }, base: { str: 7, dex: 10, agi: 12, vit: 7, end: 6, int: 7, wis: 6, lck: 10 } }, "Dragoon": { growth: { str: .8, dex: .65, agi: .65, vit: .6, end: .7, int: .5, wis: .6, lck: .5 }, base: { str: 11, dex: 9, agi: 8, vit: 8, end: 10, int: 7, wis: 9, lck: 8 } }, "Sage": { growth: { str: .4, dex: .4, agi: .75, vit: .6, end: .5, int: .9, wis: .9, lck: .55 }, base: { str: 6, dex: 6, agi: 8, vit: 7, end: 6, int: 15, wis: 15, lck: 7 } }, "DreadKnight": { growth: { str: .85, dex: .75, agi: .6, vit: .65, end: .75, int: .65, wis: .65, lck: .6 }, base: { str: 15, dex: 8, agi: 8, vit: 10, end: 11, int: 8, wis: 8, lck: 7 } } }