import { property } from '../lib/convert.js'; import { getSuitImage, getWeaponImage } from '../lib/download.js'; import { getEquipPropertyBaseScore, getEquipPropertyEnhanceCount, getEquipPropertyScore, } from '../lib/score.js'; /** * @class */ export class EquipProperty { // 类型标注 /** @type {string} */ property_name; /** @type {number} */ property_id; /** @type {string} */ base; /** @type {string} */ classname; /** * @param {{ * property_name: string; * property_id: number; * base: string * }} data */ constructor(data) { const { property_name, property_id, base } = data; this.property_name = property_name; this.property_id = property_id; this.base = base; this.classname = property.idToClassName(property_id); } /** * 获取属性分数 * @param {string} charID * @returns {number} */ get_score(charID) { /** @type {number} */ this.score = getEquipPropertyScore(charID, this.property_id, this.base); /** @type {number} */ this.base_score = getEquipPropertyBaseScore(charID, this.property_id); return this.score; } /** @type {number} */ get count() { return getEquipPropertyEnhanceCount(this.property_id, this.base); } } /** * @class */ export class EquipMainProperty { // 类型标注 /** @type {string} */ property_name; /** @type {number} */ property_id; /** @type {string} */ base; /** @type {string} */ classname; /** * @param {{ * property_name: string; * property_id: number; * base: string; * }} data */ constructor(data) { const { property_name, property_id, base } = data; this.property_name = property_name; this.property_id = property_id; this.base = base; this.classname = property.idToClassName(property_id); this.score = 0; } /** * 获取属性分数 * @param {string} charID * @returns {number} */ get_score(charID) { /** @type {number} */ const _score = getEquipPropertyBaseScore( charID, this.property_id, this.base ); if (_score > 0) { this.score = 1; } return this.score; } } /** * @class */ export class EquipSuit { /** * @param {number} suit_id * @param {string} name * @param {number} own * @param {string} desc1 * @param {string} desc2 */ constructor(suit_id, name, own, desc1, desc2) { this.suit_id = suit_id; this.name = name; this.own = own; this.desc1 = desc1; this.desc2 = desc2; } } /** * @class */ export class Equip { /** * @param {{ * id: number; * level: number; * name: string; * icon: string; * rarity: string; * properties: EquipProperty[]; * main_properties: EquipMainProperty[]; * equip_suit: EquipSuit; * equipment_type: number; * }} data */ constructor(data) { // 类型标注 /** @type {number} */ this.id; /** @type {number} */ this.level; /** @type {string} */ this.name; /** @type {string} */ this.icon; /** @type {string} */ this.rarity; /** @type {EquipProperty[]} */ this.properties; /** @type {EquipMainProperty[]} */ this.main_properties; /** @type {EquipSuit} */ this.equip_suit; /** @type {number} */ this.equipment_type; /** @type {boolean|number} */ this.score = false; const { id, level, name, icon, rarity, properties, main_properties, equip_suit, equipment_type, } = data; this.id = id; this.level = level; this.name = name; this.icon = icon; this.rarity = rarity; this.properties = properties.map(item => new EquipProperty(item)); this.main_properties = main_properties.map( item => new EquipMainProperty(item) ); this.equip_suit = equip_suit; this.equipment_type = equipment_type; } /** * @param {number} id * @returns {EquipProperty} */ get_property(id) { const result = this.properties.find(item => item.property_id === id)?.base || '0'; return Number(result); } async get_assets() { const result = await getSuitImage(this.id); this.suit_icon = result; } /** * 获取装备属性分数 * @param {string} charID * @returns {number} */ get_score(charID) { this.score = this.properties.reduce( (acc, item) => acc + item.get_score(charID), 0 ); const additional = this.main_properties.reduce( (acc, item) => acc + item.get_score(charID), 0 ); if (this.equipment_type === 4) { this.score += 4.8 * additional; } else if (this.equipment_type === 5) { this.score += 9.6 * additional; } else if (this.equipment_type === 6) { this.score += 4.8 * additional; } return this.score; } /** @type {'C'|'B'|'A'|'S'|'SS'|'SSS'|'ACE'|false} */ get comment() { if (this.score <= 8) { return 'C'; } if (this.score <= 13) { return 'B'; } if (this.score <= 18) { return 'A'; } if (this.score <= 23) { return 'S'; } if (this.score <= 28) { return 'SS'; } if (this.score <= 33) { return 'SSS'; } if (this.score > 33) { return 'ACE'; } return false; } } /** * @class */ export class Weapon { // 类型标注 /** @type {number} */ id; /** @type {number} */ level; /** @type {string} */ name; /** @type {number} */ star; /** @type {string} */ icon; /** @type {string} */ rarity; /** @type {EquipProperty[]} */ properties; /** @type {EquipMainProperty[]} */ main_properties; /** @type {string} */ talent_title; /** @type {string} */ talent_content; /** @type {number} */ profession; /** * @param {{ * id: number; * level: number; * name: string; * star: number; * icon: string; * rarity: string; * properties: EquipProperty[]; * main_properties: EquipMainProperty[]; * talent_title: string; * talent_content: string; * profession: number; * }} data */ constructor(data) { const { id, level, name, star, icon, rarity, properties, main_properties, talent_title, talent_content, profession, } = data; this.id = id; this.level = level; this.name = name; this.star = star; this.icon = icon; this.rarity = rarity; this.properties = properties.map(item => new EquipProperty(item)); this.main_properties = main_properties.map( item => new EquipMainProperty(item) ); this.talent_title = talent_title; this.talent_content = talent_content; this.profession = profession; } async get_assets() { const result = await getWeaponImage(this.id); this.square_icon = result; } }