enka-network-api
Version:
Enka-network API wrapper for Genshin Impact.
91 lines (90 loc) • 5.78 kB
JavaScript
"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;