import { defineStore } from "pinia"; import { useInfoStore } from "./info"; import api from "@/api"; import type { IEquipment } from "@/api/info/type"; import type { IResultSkillCount } from "@/api/calc/type"; // | '上衣' // | '头肩' // | '下装' // | '腰带' // | '鞋' // | '手镯' // | '项链' // | '戒指' // | '耳环' // | '辅助装备' // | '魔法石' // | '武器', export interface IConfigEquip { id: string; reinforce: number; reinforceType: number; enchant: string; emblem_0: string; emblem_1: string; upgrade: number; refine: number; adaptation: number; fusion: string; precision: number; weaponFusion: number; } export interface IConfigOath { id: string; adaptation: number; } export interface IConfigEmblem { lv: number; items: string[]; } export interface IConfig { skills: Record; equips: Record; oaths: Record; oathSkill: string; jades: Record< string, { id: number; value: number; } >; avatar: Record< string, { id: string; enchant: string; emblem_0: string; emblem_1: string; option: string; } >; sundry: Record; bindAwake: number; /** 系统奶 */ DSB: boolean; /** 奶 */ BUFF: boolean; options: Record; avatarLink: string; emblems: Record; } export interface IChangeSourceLog { id: number; source: string; detail: string; time: string; } const defaultEqusConfig = { id: "", reinforce: 0, reinforceType: 0, enchant: "", emblem_0: "", emblem_1: "", upgrade: 0, refine: 0, adaptation: 0, fusion: "", precision: 0, weaponFusion: 0, }; const defaultAvatarConfig = { id: "", enchant: "", emblem_0: "", emblem_1: "", option: "0", }; const createDefaultOathConfig = (): IConfigOath => ({ id: "", adaptation: 0, }); const defaultOathConfig = createDefaultOathConfig(); const createDefaultEmblemConfig = (): IConfigEmblem => ({ lv: 0, items: ["", "", "", "", "", ""], }); const defaultEmblemConfig = createDefaultEmblemConfig(); export const useConfigStore = defineStore("configStore", () => { const config = ref({ skills: {}, equips: {}, oaths: {}, oathSkill: "1", jades: {}, avatar: {}, sundry: {}, bindAwake: 50, DSB: false, BUFF: false, options: {}, avatarLink: "", emblems: {}, }); const skillCountConfig = ref([]); const changeSourceLogs = ref([]); const loadConfig = () => { const infoStore = useInfoStore(); const alter = infoStore.infos?.alter; if (alter) { const localConfig = localStorage.getItem(`dcalc/${alter}/config`); const localSkillConfig = localStorage.getItem(`dcalc/${alter}/config/skillCount`); if (localConfig) { config.value = JSON.parse(localConfig); } if (localSkillConfig) { skillCountConfig.value = JSON.parse(localSkillConfig); } } if (!config.value) { config.value = { skills: {}, equips: {}, oaths: {}, oathSkill: "1", jades: {}, avatar: {}, sundry: {}, bindAwake: 50, DSB: false, BUFF: false, options: {}, avatarLink: "", emblems: {}, }; } if (!config.value?.equips) config.value.equips = {}; if (!config.value?.skills) config.value.skills = {}; if (!config.value?.jades) config.value.jades = {}; if (!config.value?.avatar) config.value.avatar = {}; if (!config.value?.sundry) config.value.sundry = {}; if (!config.value?.bindAwake) config.value.bindAwake = 50; if (!config.value?.options) config.value.options = {}; if (!config.value?.oaths) config.value.oaths = {}; if (!config.value?.emblems) config.value.emblems = {}; const part = [...infoStore.parts, "宠物", "副武器"].filter( (a) => !config.value?.equips.hasOwnProperty(a), ); const avatarPart = infoStore.avatarParts .filter((a) => a != "宠物") .filter((a) => !config.value?.avatar.hasOwnProperty(a)); const skillIDs = infoStore.skills .map((skill) => skill.id.toString()) .filter((a) => !config.value?.skills.hasOwnProperty(a)); part.forEach((p) => { // oxlint-disable-next-line no-unused-expressions config.value && (config.value.equips[p] = { ...defaultEqusConfig }); }); avatarPart.forEach((p) => { // oxlint-disable-next-line no-unused-expressions config.value && (config.value.avatar[p] = { ...defaultAvatarConfig }); }); infoStore.oathParts.forEach((p) => { // oxlint-disable-next-line no-unused-expressions config.value && !config.value?.oaths.hasOwnProperty(p) && (config.value.oaths[p.toString()] = createDefaultOathConfig()); }); infoStore.options.forEach((option) => { if (Object.keys(config.value.options).includes(option.id.toString())) return; config.value.options[option.id.toString()] = 0; }); skillIDs.forEach((id) => { // oxlint-disable-next-line no-unused-expressions config.value && (config.value.skills[id] = { lv: infoStore.skills.find((skill) => skill.id.toString() === id)?.maxLearnLv ?? 0, vp: 0, up: 0, }); }); ( ["0", "1", "2", "3"].filter((key) => !Object.keys(config.value.jades).includes(key)) ?? [] ).forEach((key) => { config.value.jades[key] = { id: -1, value: 0, }; }); }; const saveConfig = () => { const infoStore = useInfoStore(); const alter = infoStore.infos?.alter; if (alter) { localStorage.setItem(`dcalc/${alter}/config`, JSON.stringify(config.value)); localStorage.setItem( `dcalc/${alter}/config/skillCount`, JSON.stringify(skillCountConfig.value), ); } }; const calc = async () => { if (!useInfoStore().infos?.alter) return undefined; const res = await api.calc(config.value); if (res.suits.oath?.suitId != res.suits.suit?.suitId) { config.value.oathSkill = "1"; } return res; }; const chooseEqu = ( equip: IEquipment | undefined, isFusion: boolean = false, isSubWeapon: boolean = false, ) => { if (!equip) return; const part = isSubWeapon ? "副武器" : equip?.itemType == "武器" ? "武器" : equip?.itemDetailType; if (equip && config.value.equips[part]) { const key = isFusion ? "fusion" : "id"; if (config.value.equips[part][key] == equip.id) { config.value.equips[part][key] = ""; } else { config.value.equips[part][key] = equip.id; } } }; const pushChangeSource = (source: string, detail: string) => { const next: IChangeSourceLog = { id: Date.now() + Math.floor(Math.random() * 1000), source, detail, time: new Date().toLocaleTimeString("zh-CN", { hour12: false }), }; changeSourceLogs.value = [next, ...changeSourceLogs.value].slice(0, 30); }; const clearChangeSource = () => { changeSourceLogs.value = []; }; const result = useAsyncState( () => { return calc(); }, { uuid: "", skills: [], info: [], suits: {}, buffer: false, }, { resetOnExecute: false }, ); return { config, loadConfig, saveConfig, calc, result, chooseEqu, skillCountConfig, defaultEqusConfig, defaultAvatarConfig, defaultOathConfig, createDefaultOathConfig, defaultEmblemConfig, createDefaultEmblemConfig, changeSourceLogs, pushChangeSource, clearChangeSource, }; });