UNPKG

enka-network-api

Version:

Enka-network API wrapper for Genshin Impact.

91 lines (90 loc) 5.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WeaponData = void 0; const config_file_js_1 = require("config_file.js"); const AssetsNotFoundError_1 = require("../../errors/AssetsNotFoundError"); const ImageAssets_1 = require("../assets/ImageAssets"); const TextAssets_1 = require("../assets/TextAssets"); const WeaponRefinement_1 = require("./WeaponRefinement"); const StatProperty_1 = require("../StatProperty"); const WeaponAscension_1 = require("./WeaponAscension"); const ts_utils_1 = require("../../utils/ts_utils"); const ExcelTransformer_1 = require("../../client/ExcelTransformer"); class WeaponData { constructor(data, enka) { this._data = data; this.enka = enka; const json = new config_file_js_1.JsonReader(ExcelTransformer_1.excelJsonOptions, this._data); this.id = json.getAsNumber("id"); this.name = new TextAssets_1.TextAssets(json.getAsNumber("nameTextMapHash"), enka); this.description = new TextAssets_1.TextAssets(json.getAsNumber("descTextMapHash"), enka); this._nameId = json.getAsString("icon").slice("UI_EquipIcon_".length); this.icon = new ImageAssets_1.ImageAssets(json.getAsString("icon"), enka); this.awakenIcon = new ImageAssets_1.ImageAssets(json.getAsString("awakenIcon"), enka); this.splashImage = new ImageAssets_1.ImageAssets(`UI_Gacha_EquipIcon_${this._nameId}`, enka); this.stars = json.getAsNumber("rankLevel"); this.weaponType = json.getAsString("weaponType"); const weaponTypeData = enka.cachedAssetsManager.getExcelData("ManualTextMapConfigData", this.weaponType); if (!weaponTypeData) throw new AssetsNotFoundError_1.AssetsNotFoundError("Weapon Type", this.weaponType); this._weaponTypeData = weaponTypeData; this.weaponTypeName = new TextAssets_1.TextAssets(new config_file_js_1.JsonReader(ExcelTransformer_1.excelJsonOptions, weaponTypeData).getAsNumber("textMapContentTextMapHash"), enka); this.refinements = (() => { const refinementId = json.getAsNumberWithDefault(0, "skillAffix", 0); if (refinementId === 0) return []; const refinementsData = enka.cachedAssetsManager.getExcelData("EquipAffixExcelConfigData", refinementId); if (!refinementsData) throw new AssetsNotFoundError_1.AssetsNotFoundError("Weapon Refinements", refinementId); const refinementsJson = Object.entries(refinementsData).sort(([a], [b]) => Number(a) - Number(b)); return refinementsJson.map(([, r]) => new WeaponRefinement_1.WeaponRefinement(r, enka)); })(); } /** * @param ascension ascension level 0-6 for 3-5 stars, and 0-4 for 1-2 stars. */ getAscensionData(ascension) { return WeaponAscension_1.WeaponAscension.getById(new config_file_js_1.JsonReader(ExcelTransformer_1.excelJsonOptions, this._data).getAsNumber("weaponPromoteId"), ascension, this.enka); } /** * @param ascension ascension level 0-6 for 3-5 stars, and 0-4 for 1-2 stars. * @param level weapon level 1-90 for 3-5 stars, and 1-70 for 1-2 stars. */ getStats(ascension, level) { const maxAscension = this.stars < 3 ? 4 : 6; const maxLevel = this.stars < 3 ? 70 : 90; if (ascension < 0 || maxAscension < ascension) throw new Error(`Ascension levels must be between 0 and ${maxAscension} for ${this.stars} stars.`); if (level < 1 || maxLevel < level) throw new Error(`Weapon levels must be between 1 and ${maxLevel} for ${this.stars} stars.`); const curveData = this.enka.cachedAssetsManager.getExcelData("WeaponCurveExcelConfigData", level); if (!curveData) throw new AssetsNotFoundError_1.AssetsNotFoundError("Weapon Curve", level); const curve = new config_file_js_1.JsonReader(ExcelTransformer_1.excelJsonOptions, curveData).get("curveInfos"); const ascensionData = this.getAscensionData(ascension); const weaponJson = new config_file_js_1.JsonReader(ExcelTransformer_1.excelJsonOptions, this._data); const weaponProps = weaponJson.get("weaponProp"); const statPropertiesWithBaseValues = weaponProps.mapArray((_, prop) => { var _a, _b, _c; const fightProp = prop.getAsStringWithDefault(null, "propType"); const baseValue = prop.getAsNumberWithDefault(null, "initValue"); if (!fightProp || !baseValue) return null; const curveType = prop.getAsString("type"); const targetCurve = (_a = curve.findArray((__, c) => c.getAsString("type") === curveType)) === null || _a === void 0 ? void 0 : _a[1]; const ascensionValue = (_c = (_b = ascensionData.addProps.find(p => p.fightProp === fightProp)) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : 0; const value = baseValue * (targetCurve ? targetCurve.getAsNumber("value") : 1) + ascensionValue; return new StatProperty_1.StatProperty(fightProp, value, this.enka); }).filter(ts_utils_1.nonNullable); const usedFightProps = statPropertiesWithBaseValues.map(s => s.fightProp); const statPropertiesWithoutBaseValues = ascensionData.addProps.filter(p => !usedFightProps.includes(p.fightProp)); return [...statPropertiesWithBaseValues, ...statPropertiesWithoutBaseValues]; } static getById(id, enka) { const data = enka.cachedAssetsManager.getExcelData("WeaponExcelConfigData", id); if (!data) throw new AssetsNotFoundError_1.AssetsNotFoundError("Weapon", id); return new WeaponData(data, enka); } } exports.WeaponData = WeaponData;