77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
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,
|
|
}
|