323 lines
7.6 KiB
TypeScript
323 lines
7.6 KiB
TypeScript
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<string, { lv: number; vp: number; up: number }>;
|
|
equips: Record<string, IConfigEquip>;
|
|
oaths: Record<string, IConfigOath>;
|
|
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<string, unknown>;
|
|
bindAwake: number;
|
|
/** 系统奶 */
|
|
DSB: boolean;
|
|
/** 奶 */
|
|
BUFF: boolean;
|
|
options: Record<string, number>;
|
|
avatarLink: string;
|
|
emblems: Record<string, IConfigEmblem>;
|
|
}
|
|
|
|
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<IConfig>({
|
|
skills: {},
|
|
equips: {},
|
|
oaths: {},
|
|
oathSkill: "1",
|
|
jades: {},
|
|
avatar: {},
|
|
sundry: {},
|
|
bindAwake: 50,
|
|
DSB: false,
|
|
BUFF: false,
|
|
options: {},
|
|
avatarLink: "",
|
|
emblems: {},
|
|
});
|
|
|
|
const skillCountConfig = ref<IResultSkillCount[]>([]);
|
|
const changeSourceLogs = ref<IChangeSourceLog[]>([]);
|
|
|
|
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,
|
|
};
|
|
});
|