diff --git a/backend/core/character/GF/gunner_female/spitfire_female.py b/backend/core/character/GF/gunner_female/spitfire_female.py index ab7e7678..a5af2f6b 100644 --- a/backend/core/character/GF/gunner_female/spitfire_female.py +++ b/backend/core/character/GF/gunner_female/spitfire_female.py @@ -196,6 +196,7 @@ class Skill9(ActiveSkill): cd = 5 mp = [357, 2765] uuid = "3c5604bdbb0240b8f130f59ab40509c3" + hasReinforce = False data0 = [0, 1034, 1200, 1364, 1528, 1693, 1857, 2021, 2187, 2352, 2516, 2682, 2846, 3010, 3175, 3339, 3505, 3671, 3835, 4000, 4164]# noqa: E501 hit0 = 1 diff --git a/frontend/src/assets/img/icon/exchange.png b/frontend/src/assets/img/icon/exchange.png new file mode 100644 index 00000000..8ce035c8 Binary files /dev/null and b/frontend/src/assets/img/icon/exchange.png differ diff --git a/frontend/src/assets/img/icon/exchange_active.png b/frontend/src/assets/img/icon/exchange_active.png new file mode 100644 index 00000000..7e5fa308 Binary files /dev/null and b/frontend/src/assets/img/icon/exchange_active.png differ diff --git a/frontend/src/assets/img/icon/exchange_hover.png b/frontend/src/assets/img/icon/exchange_hover.png new file mode 100644 index 00000000..0c60acce Binary files /dev/null and b/frontend/src/assets/img/icon/exchange_hover.png differ diff --git a/frontend/src/pages/Character/Skill/components/Skill/index.tsx b/frontend/src/pages/Character/Skill/components/Skill/index.tsx deleted file mode 100644 index ebb93371..00000000 --- a/frontend/src/pages/Character/Skill/components/Skill/index.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { getImageURL, getLocalImageURL } from '@/utils/images' -import type { ISkill } from '@/api/info/type' -import { useVModel } from '@vueuse/core' -import CalcButton from '@/components/calc/button/index.vue' -import CalcCheckbox from '@/components/calc/checkbox/index.vue' -import { renderList } from 'vue' - -export default defineComponent({ - name: 'SkillTree', - props: { - skills: { - type: Array as PropType, - default: () => [], - }, - lvInfo: { - type: Object as PropType>, - default: () => ({}), - }, - }, - setup(props) { - const lvInfo = useVModel(props, 'lvInfo') - const skills = computed(() => props.skills.filter((a) => a.hasReinforce).sort((a, b) => a.learnLv - b.learnLv)) - - const reinforce = (type:number,id:number)=>{ - return computed({ - get(){ - return lvInfo.value[id].reinforce - }, - set(value){ - - } - }) - } - - return () => ( - <> -
-
-
-
-
- - ) - }, -}) diff --git a/frontend/src/pages/Character/Skill/components/SkillReinforce/img/bg.png b/frontend/src/pages/Character/Skill/components/SkillReinforce/img/bg.png new file mode 100644 index 00000000..89e0bfc6 Binary files /dev/null and b/frontend/src/pages/Character/Skill/components/SkillReinforce/img/bg.png differ diff --git a/frontend/src/pages/Character/Skill/components/SkillReinforce/index.tsx b/frontend/src/pages/Character/Skill/components/SkillReinforce/index.tsx index 595a5bcc..3f6a6a0e 100644 --- a/frontend/src/pages/Character/Skill/components/SkillReinforce/index.tsx +++ b/frontend/src/pages/Character/Skill/components/SkillReinforce/index.tsx @@ -3,7 +3,10 @@ import type { ISkill } from '@/api/info/type' import { useVModel } from '@vueuse/core' import CalcButton from '@/components/calc/button/index.vue' import CalcCheckbox from '@/components/calc/checkbox/index.vue' -import { renderList } from 'vue' +import CaclIconSelect from '@/components/calc/iconselect/index.vue' +import CalcOption from '@/components/calc/option/index.vue' +import { render, renderList } from 'vue' +import './style.scss' export default defineComponent({ name: 'SkillTree', @@ -13,75 +16,73 @@ export default defineComponent({ default: () => [], }, lvInfo: { - type: Object as PropType>, + type: Object as PropType>, default: () => ({}), }, }, setup(props) { const lvInfo = useVModel(props, 'lvInfo') - const skills = computed(() => props.skills.filter((a) => a.hasVP).sort((a, b) => a.learnLv - b.learnLv)) + const skills = computed(() => + props.skills.filter((a) => a.hasReinforce && (!lvInfo.value[a.id]?.reinforce || lvInfo.value[a.id]?.reinforce == 0)).sort((a, b) => a.learnLv - b.learnLv), + ) - const currentUsedVP = computed(()=>{ - return Object.keys(lvInfo.value).map(a=>lvInfo.value[a].vp).filter(a=>!!a && a > 0).length - }) - - const itemChecked = (skillID:string,vp:number)=>{ - return computed({ - get(){ - if(!lvInfo.value[skillID].vp){ - lvInfo.value[skillID].vp = 0 - } - return lvInfo.value[skillID]?.vp == vp + const reinforce = (type: number, id: number) => { + return computed({ + get() { + return lvInfo.value[id].reinforce }, - set(value:boolean){ - // 选中当前VP形态 并且当前已选VP大于5 并且当前技能没有VP - if(value && currentUsedVP.value >= 5 && lvInfo.value[skillID]?.vp == 0){ - return - } - if(value){ - lvInfo.value[skillID].vp = vp - }else{ - lvInfo.value[skillID].vp = 0 - } - } + set(value) {}, }) } return () => ( <> -
- {renderList(skills.value, (item) => ( -
-
{item.learnLv}
-
- {item.name} -
{item.name}
-
- {renderList(2, (index) => ( -
{ - itemChecked(item.id.toString(), index).value = !itemChecked(item.id.toString(), index).value - }}> -
-
-
-
- {item.name} +
+
+
+ {renderList(3, (index) => ( + <> +
+ + {renderList(skills.value, (item) => ( + <> + + {item.name} + + + ))} + + + + {renderList(skills.value, (item) => ( + <> + + {item.name} + + + ))} +
- -
- -
+ ))}
- ))} +
+ {renderList(skills.value, (item) => ( +
+ {item.name} +
+ ))} + {renderList(36 - skills.value.length, (item) => ( +
+ ))} +
+
) diff --git a/frontend/src/pages/Character/Skill/components/SkillReinforce/style.scss b/frontend/src/pages/Character/Skill/components/SkillReinforce/style.scss new file mode 100644 index 00000000..ad34f4da --- /dev/null +++ b/frontend/src/pages/Character/Skill/components/SkillReinforce/style.scss @@ -0,0 +1,7 @@ +.skill-reinforce { + width: 620px; + height: 375px; + background-image: url('./img/bg.png'); + background-size: 100% 100%; + background-color: black; +} diff --git a/frontend/src/pages/Character/Skill/components/SkillVP/img/bg.png b/frontend/src/pages/Character/Skill/components/SkillVP/img/bg.png new file mode 100644 index 00000000..e8019bfb Binary files /dev/null and b/frontend/src/pages/Character/Skill/components/SkillVP/img/bg.png differ diff --git a/frontend/src/pages/Character/Skill/components/SkillVP/index.tsx b/frontend/src/pages/Character/Skill/components/SkillVP/index.tsx new file mode 100644 index 00000000..6fcc1880 --- /dev/null +++ b/frontend/src/pages/Character/Skill/components/SkillVP/index.tsx @@ -0,0 +1,102 @@ +import { getImageURL, getLocalImageURL } from '@/utils/images' +import type { ISkill } from '@/api/info/type' +import { useVModel } from '@vueuse/core' +import CalcButton from '@/components/calc/button/index.vue' +import CalcCheckbox from '@/components/calc/checkbox/index.vue' +import { renderList } from 'vue' +import './style.scss' +export default defineComponent({ + name: 'SkillTree', + props: { + skills: { + type: Array as PropType, + default: () => [], + }, + lvInfo: { + type: Object as PropType>, + default: () => ({}), + }, + }, + setup(props) { + const lvInfo = useVModel(props, 'lvInfo') + const skills = computed(() => + props.skills.filter((a) => a.hasVP && lvInfo).sort((a, b) => a.learnLv - b.learnLv), + ) + + const currentUsedVP = computed(() => { + return Object.keys(lvInfo.value) + .map((a) => lvInfo.value[a].vp) + .filter((a) => !!a && a > 0).length + }) + + const itemChecked = (skillID: string, vp: number) => { + return computed({ + get() { + if (!lvInfo.value[skillID].vp) { + lvInfo.value[skillID].vp = 0 + } + return lvInfo.value[skillID]?.vp == vp + }, + set(value: boolean) { + // 选中当前VP形态 并且当前已选VP大于5 并且当前技能没有VP + if (value && currentUsedVP.value >= 5 && lvInfo.value[skillID]?.vp == 0) { + return + } + if (value) { + lvInfo.value[skillID].vp = vp + } else { + lvInfo.value[skillID].vp = 0 + } + }, + }) + } + + return () => ( + <> +
+ {renderList(skills.value, (item) => ( +
+
{item.learnLv}
+
+
+ {item.name} +
+
{item.name}
+
+ {renderList(2, (index) => ( +
{ + itemChecked(item.id.toString(), index).value = !itemChecked( + item.id.toString(), + index, + ).value + }} + > +
+
+ = 5 && lvInfo.value[item.id.toString()]?.vp == 0} /> +
+
+
+ {item.name} +
+
+
+
+ ))} +
+ ))} +
+ + ) + }, +}) diff --git a/frontend/src/pages/Character/Skill/components/SkillVP/style.scss b/frontend/src/pages/Character/Skill/components/SkillVP/style.scss new file mode 100644 index 00000000..e38825f2 --- /dev/null +++ b/frontend/src/pages/Character/Skill/components/SkillVP/style.scss @@ -0,0 +1,16 @@ +.vp { + &:nth-child(n + 1) { + background-color: #000000; + } + &:nth-child(2n + 1) { + background-color: #080808; + } + + .vp-item { + height: 124px; + width: 152px; + background-image: url(./img/bg.png); + padding:15px 20px ; + box-sizing: border-box; + } +} diff --git a/frontend/src/pages/Character/Skill/index.vue b/frontend/src/pages/Character/Skill/index.vue index 640042c7..096a6df4 100644 --- a/frontend/src/pages/Character/Skill/index.vue +++ b/frontend/src/pages/Character/Skill/index.vue @@ -1,31 +1,67 @@ + + diff --git a/frontend/src/style/icon.scss b/frontend/src/style/icon.scss index f5d4ee4d..7624da1f 100644 --- a/frontend/src/style/icon.scss +++ b/frontend/src/style/icon.scss @@ -111,6 +111,11 @@ @include icon-style('min'); } +.icon-exchange { + @include icon-style('exchange', 20px, 20px, auto 100%); +} + + .icon-increase-little { @include icon-style('increase', 16px, 16px); }