srd/plugins/srd-aedifex-router/specimen.js

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,
}