fix:修复浅拷贝数组问题
This commit is contained in:
@@ -112,9 +112,31 @@ const emblemItemStyle = (index: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ensurePartConfig = (partName: string) => {
|
||||||
|
if (!configStore.config.emblems[partName]) {
|
||||||
|
configStore.config.emblems[partName] = configStore.createDefaultEmblemConfig()
|
||||||
|
}
|
||||||
|
const target = configStore.config.emblems[partName]
|
||||||
|
if (!Array.isArray(target.items)) {
|
||||||
|
target.items = ['', '', '', '', '', '']
|
||||||
|
}
|
||||||
|
if (target.items.length < 6) {
|
||||||
|
target.items = [...target.items, ...Array.from({ length: 6 - target.items.length }, () => '')]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
part,
|
||||||
|
(newPart) => {
|
||||||
|
ensurePartConfig(newPart)
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
|
|
||||||
const currentInfo = function <T>(name: string, defaultValue?: T) {
|
const currentInfo = function <T>(name: string, defaultValue?: T) {
|
||||||
return computed<string | number>({
|
return computed<string | number>({
|
||||||
get() {
|
get() {
|
||||||
|
ensurePartConfig(part.value)
|
||||||
return (
|
return (
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
(configStore.config.emblems?.[part.value] as Record<string, any>)?.[name] ??
|
(configStore.config.emblems?.[part.value] as Record<string, any>)?.[name] ??
|
||||||
@@ -131,40 +153,28 @@ const currentInfo = function <T>(name: string, defaultValue?: T) {
|
|||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (!configStore.config.emblems[part.value]) {
|
ensurePartConfig(part.value)
|
||||||
configStore.config.emblems[part.value] = { ...configStore.defaultEmblemConfig }
|
|
||||||
}
|
|
||||||
if (configStore.config.emblems[part.value]) {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
;(configStore.config.emblems[part.value] as Record<string, any>)[name] = val
|
;(configStore.config.emblems[part.value] as Record<string, any>)[name] = val
|
||||||
}
|
|
||||||
if (part.value == '彩色' && name == 'lv') {
|
if (part.value == '彩色' && name == 'lv') {
|
||||||
// 同步其他部位的等级
|
// 同步其他部位的等级
|
||||||
const lv = val as number
|
const lv = val as number
|
||||||
for (const p of ['红色', '蓝色', '黄色', '绿色']) {
|
for (const p of ['红色', '蓝色', '黄色', '绿色']) {
|
||||||
if (!configStore.config.emblems[p]) {
|
ensurePartConfig(p)
|
||||||
configStore.config.emblems[p] = { ...configStore.defaultEmblemConfig }
|
|
||||||
}
|
|
||||||
if (configStore.config.emblems[p]) {
|
|
||||||
configStore.config.emblems[p]['lv'] = Math.max(
|
configStore.config.emblems[p]['lv'] = Math.max(
|
||||||
configStore.config.emblems[p]['lv'] || 0,
|
configStore.config.emblems[p]['lv'] || 0,
|
||||||
lv,
|
lv,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if (part.value != '彩色' && name == 'lv') {
|
} else if (part.value != '彩色' && name == 'lv') {
|
||||||
// 同步彩色部位的等级
|
// 同步彩色部位的等级
|
||||||
const lv = val as number
|
const lv = val as number
|
||||||
if (!configStore.config.emblems['彩色']) {
|
ensurePartConfig('彩色')
|
||||||
configStore.config.emblems['彩色'] = { ...configStore.defaultEmblemConfig }
|
|
||||||
}
|
|
||||||
if (configStore.config.emblems['彩色']) {
|
|
||||||
configStore.config.emblems['彩色']['lv'] = Math.min(
|
configStore.config.emblems['彩色']['lv'] = Math.min(
|
||||||
configStore.config.emblems['彩色']['lv'] || 0,
|
configStore.config.emblems['彩色']['lv'] || 0,
|
||||||
lv,
|
lv,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ const currentInfo = function <T>(name: string, defaultValue?: T) {
|
|||||||
|
|
||||||
for (const part of parts) {
|
for (const part of parts) {
|
||||||
if (!configStore.config.oaths[part]) {
|
if (!configStore.config.oaths[part]) {
|
||||||
configStore.config.oaths[part] = { ...configStore.defaultOathConfig }
|
configStore.config.oaths[part] = configStore.createDefaultOathConfig()
|
||||||
}
|
}
|
||||||
if (configStore.config.oaths[part]) {
|
if (configStore.config.oaths[part]) {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
|||||||
@@ -98,16 +98,20 @@ const defaultAvatarConfig = {
|
|||||||
option: '0',
|
option: '0',
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultOathConfig = {
|
const createDefaultOathConfig = (): IConfigOath => ({
|
||||||
id: '',
|
id: '',
|
||||||
adaptation: 0,
|
adaptation: 0,
|
||||||
upgrade: [0, 0, 0, 0],
|
upgrade: [0, 0, 0, 0],
|
||||||
}
|
})
|
||||||
|
|
||||||
const defaultEmblemConfig = {
|
const defaultOathConfig = createDefaultOathConfig()
|
||||||
|
|
||||||
|
const createDefaultEmblemConfig = (): IConfigEmblem => ({
|
||||||
lv: 0,
|
lv: 0,
|
||||||
items: ['', '', '', '', '', ''],
|
items: ['', '', '', '', '', ''],
|
||||||
}
|
})
|
||||||
|
|
||||||
|
const defaultEmblemConfig = createDefaultEmblemConfig()
|
||||||
|
|
||||||
export const useConfigStore = defineStore('configStore', () => {
|
export const useConfigStore = defineStore('configStore', () => {
|
||||||
const config = ref<IConfig>({
|
const config = ref<IConfig>({
|
||||||
@@ -194,7 +198,7 @@ export const useConfigStore = defineStore('configStore', () => {
|
|||||||
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
||||||
config.value &&
|
config.value &&
|
||||||
!config.value?.oaths.hasOwnProperty(p) &&
|
!config.value?.oaths.hasOwnProperty(p) &&
|
||||||
(config.value.oaths[p.toString()] = { ...defaultOathConfig })
|
(config.value.oaths[p.toString()] = createDefaultOathConfig())
|
||||||
})
|
})
|
||||||
|
|
||||||
infoStore.options.forEach((option) => {
|
infoStore.options.forEach((option) => {
|
||||||
@@ -284,6 +288,8 @@ export const useConfigStore = defineStore('configStore', () => {
|
|||||||
defaultEqusConfig,
|
defaultEqusConfig,
|
||||||
defaultAvatarConfig,
|
defaultAvatarConfig,
|
||||||
defaultOathConfig,
|
defaultOathConfig,
|
||||||
|
createDefaultOathConfig,
|
||||||
defaultEmblemConfig,
|
defaultEmblemConfig,
|
||||||
|
createDefaultEmblemConfig,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -232,7 +232,9 @@ const setOathAdaptation = (part: string, value: string) => {
|
|||||||
configStore.config.oaths[item].adaptation = Math.max(0, parsed);
|
configStore.config.oaths[item].adaptation = Math.max(0, parsed);
|
||||||
});
|
});
|
||||||
|
|
||||||
setNotice(oathBatchApply.value ? "已批量更新全部誓约槽位适配值。" : `已更新誓约槽位 ${part} 的适配值。`);
|
setNotice(
|
||||||
|
oathBatchApply.value ? "已批量更新全部誓约槽位适配值。" : `已更新誓约槽位 ${part} 的适配值。`,
|
||||||
|
);
|
||||||
trackSource(oathBatchApply.value ? "誓约适配已批量更新" : `誓约槽位 ${part} 适配已更新`);
|
trackSource(oathBatchApply.value ? "誓约适配已批量更新" : `誓约槽位 ${part} 适配已更新`);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -348,7 +350,8 @@ const setEquipNumberField = (
|
|||||||
|
|
||||||
const normalized =
|
const normalized =
|
||||||
field === "precision" ? Math.max(0, Math.min(parsed, 100)) : Math.max(0, parsed);
|
field === "precision" ? Math.max(0, Math.min(parsed, 100)) : Math.max(0, parsed);
|
||||||
const canBatch = equipBatchApply.value && ["reinforceType", "reinforce", "adaptation"].includes(field);
|
const canBatch =
|
||||||
|
equipBatchApply.value && ["reinforceType", "reinforce", "adaptation"].includes(field);
|
||||||
const partsToApply = canBatch ? infoStore.parts.filter(canUpgradeEquip) : [part];
|
const partsToApply = canBatch ? infoStore.parts.filter(canUpgradeEquip) : [part];
|
||||||
|
|
||||||
partsToApply.forEach((item) => {
|
partsToApply.forEach((item) => {
|
||||||
@@ -379,9 +382,15 @@ const setEquipEnchant = (part: string, value: string) => {
|
|||||||
configStore.config.equips[item].enchant = value;
|
configStore.config.equips[item].enchant = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
setNotice(equipBatchApply.value && partsToApply.length > 1 ? "已批量更新装备附魔。" : `已更新 ${part} 的附魔。`);
|
setNotice(
|
||||||
|
equipBatchApply.value && partsToApply.length > 1
|
||||||
|
? "已批量更新装备附魔。"
|
||||||
|
: `已更新 ${part} 的附魔。`,
|
||||||
|
);
|
||||||
trackSource(
|
trackSource(
|
||||||
equipBatchApply.value && partsToApply.length > 1 ? "装备附魔已批量更新" : `装备 ${part} 附魔已更新`,
|
equipBatchApply.value && partsToApply.length > 1
|
||||||
|
? "装备附魔已批量更新"
|
||||||
|
: `装备 ${part} 附魔已更新`,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -421,7 +430,7 @@ const resetAvatarPart = () => {
|
|||||||
|
|
||||||
const ensureEmblemPart = (part: string) => {
|
const ensureEmblemPart = (part: string) => {
|
||||||
if (!configStore.config.emblems[part]) {
|
if (!configStore.config.emblems[part]) {
|
||||||
configStore.config.emblems[part] = { ...configStore.defaultEmblemConfig };
|
configStore.config.emblems[part] = configStore.createDefaultEmblemConfig();
|
||||||
}
|
}
|
||||||
return configStore.config.emblems[part];
|
return configStore.config.emblems[part];
|
||||||
};
|
};
|
||||||
@@ -463,7 +472,7 @@ const setEmblemItem = (index: number, value: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const resetEmblemPart = () => {
|
const resetEmblemPart = () => {
|
||||||
configStore.config.emblems[emblemPart.value] = { ...configStore.defaultEmblemConfig };
|
configStore.config.emblems[emblemPart.value] = configStore.createDefaultEmblemConfig();
|
||||||
setNotice(`已重置 ${emblemPart.value} 徽章配置。`);
|
setNotice(`已重置 ${emblemPart.value} 徽章配置。`);
|
||||||
trackSource(`徽章 ${emblemPart.value} 已重置`);
|
trackSource(`徽章 ${emblemPart.value} 已重置`);
|
||||||
};
|
};
|
||||||
@@ -503,7 +512,7 @@ const resetAllForge = () => {
|
|||||||
configStore.config.avatar[part] = { ...configStore.defaultAvatarConfig };
|
configStore.config.avatar[part] = { ...configStore.defaultAvatarConfig };
|
||||||
});
|
});
|
||||||
infoStore.emblemParts.forEach((part) => {
|
infoStore.emblemParts.forEach((part) => {
|
||||||
configStore.config.emblems[part] = { ...configStore.defaultEmblemConfig };
|
configStore.config.emblems[part] = configStore.createDefaultEmblemConfig();
|
||||||
});
|
});
|
||||||
jadeKeys.forEach((key) => {
|
jadeKeys.forEach((key) => {
|
||||||
configStore.config.jades[key] = { id: -1, value: 0 };
|
configStore.config.jades[key] = { id: -1, value: 0 };
|
||||||
@@ -688,11 +697,7 @@ const resetAllForge = () => {
|
|||||||
<span>批量应用到同类部位</span>
|
<span>批量应用到同类部位</span>
|
||||||
<input v-model="equipBatchApply" type="checkbox" class="size-4" />
|
<input v-model="equipBatchApply" type="checkbox" class="size-4" />
|
||||||
</label>
|
</label>
|
||||||
<div
|
<div v-for="part in parts" :key="part" class="space-y-3 rounded-md border p-2 md:p-3">
|
||||||
v-for="part in parts"
|
|
||||||
:key="part"
|
|
||||||
class="space-y-3 rounded-md border p-2 md:p-3"
|
|
||||||
>
|
|
||||||
<div class="grid grid-cols-[5rem_minmax(0,1fr)_auto] items-center gap-2">
|
<div class="grid grid-cols-[5rem_minmax(0,1fr)_auto] items-center gap-2">
|
||||||
<div class="font-medium">{{ part }}</div>
|
<div class="font-medium">{{ part }}</div>
|
||||||
<div class="truncate text-muted-foreground">
|
<div class="truncate text-muted-foreground">
|
||||||
@@ -1108,10 +1113,7 @@ const resetAllForge = () => {
|
|||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div v-if="forgeViewTab === 'config' && moduleMode === 'jade'" class="grid grid-cols-1 gap-4">
|
||||||
v-if="forgeViewTab === 'config' && moduleMode === 'jade'"
|
|
||||||
class="grid grid-cols-1 gap-4"
|
|
||||||
>
|
|
||||||
<Card class="border-border/60 bg-card/90">
|
<Card class="border-border/60 bg-card/90">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle class="flex items-center gap-2">
|
<CardTitle class="flex items-center gap-2">
|
||||||
|
|||||||
@@ -109,10 +109,12 @@ const defaultOathConfig = {
|
|||||||
adaptation: 0,
|
adaptation: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
const defaultEmblemConfig = {
|
const createDefaultEmblemConfig = (): IConfigEmblem => ({
|
||||||
lv: 0,
|
lv: 0,
|
||||||
items: ["", "", "", "", "", ""],
|
items: ["", "", "", "", "", ""],
|
||||||
};
|
});
|
||||||
|
|
||||||
|
const defaultEmblemConfig = createDefaultEmblemConfig();
|
||||||
|
|
||||||
export const useConfigStore = defineStore("configStore", () => {
|
export const useConfigStore = defineStore("configStore", () => {
|
||||||
const config = ref<IConfig>({
|
const config = ref<IConfig>({
|
||||||
@@ -309,6 +311,7 @@ export const useConfigStore = defineStore("configStore", () => {
|
|||||||
defaultAvatarConfig,
|
defaultAvatarConfig,
|
||||||
defaultOathConfig,
|
defaultOathConfig,
|
||||||
defaultEmblemConfig,
|
defaultEmblemConfig,
|
||||||
|
createDefaultEmblemConfig,
|
||||||
changeSourceLogs,
|
changeSourceLogs,
|
||||||
pushChangeSource,
|
pushChangeSource,
|
||||||
clearChangeSource,
|
clearChangeSource,
|
||||||
|
|||||||
Reference in New Issue
Block a user