const semver = require('semver') const { IncorrectTypeError, IncorrectPropertyError, MismatchedVersionError } = require('./errors.js') function readSpecimens(collection, v) { if (v.type !== 'hord-specimens') { throw new IncorrectTypeError('hord-specimens', v.type) } if (!Array.isArray(v.specimens)) { throw new IncorrectPropertyError('specimens', typeof [], typeof v.specimens) } if (!v.version || !semver.satisfies(v.version, '1.x')) { throw new MismatchedVersionError('1.x', v.version) } for (let s of v.specimens) { // Assign file family to specimen type just for sorting simplicity. s.type = v.family s.combatvalue = calculateCV(s) collection.insert(s) } } function calculateCV(t) { if (!t) return 0 if (t.combatvalue) return t.combatvalue let v = 0 if (t.health) { v += 1 + t.health/2 } if(t.move) { v += t.move } if (t.attack) { v += t.attack } if (Array.isArray(t.attacks) && t.attacks.length > 0) { let avgDmg = 0 let avgAtk = 0 let hasOpportunity = 0 for (let a of t.attacks) { let aDmg = 0 for (let d of a.damage) { aDmg += d.value } avgDmg += aDmg / a.damage.length avgAtk += a.attack if (a.opportunistic) { hasOpportunity = 1 } } avgDmg /= t.attacks.length avgAtk /= t.attacks.length v += avgDmg / avgAtk + hasOpportunity } if (Array.isArray(t.defenses)) { let maxDef = 0 let defs = t.defenses.length let perfects = 0 for (let d of t.defenses) { if (d.perfect) { perfects++ } maxDef = Math.max(maxDef, d.value) } v += maxDef + defs + perfects } if (Array.isArray(t.specials)) { v += t.specials.length } return Math.round(v) } module.exports = { readSpecimens, }