From 7d63093971e287fb49a9740a4cd58f1c19bf1642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Mon, 10 Aug 2026 03:10:55 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BB=91=E6=9A=97=E6=AD=A6=E5=A3=AB=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/core/character/adventure.py | 2 +- .../DarkKnightSkillSetting/index.vue | 592 ++++++++++++++++++ .../Skill/components/img/shortcut.png | Bin 0 -> 4162 bytes frontend/src/pages/Character/Skill/index.vue | 127 +++- frontend/src/stores/config.ts | 48 +- 5 files changed, 757 insertions(+), 12 deletions(-) create mode 100644 frontend/src/pages/Character/Skill/components/DarkKnightSkillSetting/index.vue create mode 100644 frontend/src/pages/Character/Skill/components/img/shortcut.png diff --git a/backend/core/character/adventure.py b/backend/core/character/adventure.py index 0e89ed21..a206638c 100644 --- a/backend/core/character/adventure.py +++ b/backend/core/character/adventure.py @@ -221,7 +221,7 @@ adv = [ 'title': '外传', 'children': [ {'id': 0, 'name': 'creator', 'title': '知源·缔造者', 'open': True, 'class': 'GF.extra.creator'}, - {'id': 1, 'name': 'dark_knight', 'title': '极诣·黑暗武士', 'open': False}, + {'id': 1, 'name': 'dark_knight', 'title': '极诣·黑暗武士', 'open': True, 'class': 'GF.extra.dark_knight'}, {'id': 2, 'name': 'empty', 'title': ''}, {'id': 3, 'name': 'empty', 'title': ''}, {'id': 4, 'name': 'empty', 'title': ''}, diff --git a/frontend/src/pages/Character/Skill/components/DarkKnightSkillSetting/index.vue b/frontend/src/pages/Character/Skill/components/DarkKnightSkillSetting/index.vue new file mode 100644 index 00000000..b682628c --- /dev/null +++ b/frontend/src/pages/Character/Skill/components/DarkKnightSkillSetting/index.vue @@ -0,0 +1,592 @@ + + + + + diff --git a/frontend/src/pages/Character/Skill/components/img/shortcut.png b/frontend/src/pages/Character/Skill/components/img/shortcut.png new file mode 100644 index 0000000000000000000000000000000000000000..282a4d2b421280e0475c06b1f2fe73dc4c85863f GIT binary patch literal 4162 zcmV-I5WVk-P)GXLTq7UYhz(_AXa5^b7^mGB0?%%I%Dsew$^o*cjnsG z&a!oSr_GXCwS|5GbYOVDRK2fnC@_vIn0)&u+5JE`8-6v6}Dhl-KS?gOQ z`49j9o&E2#_qX@q;QkEGHLx*u4fo|C_j>RMe1hQG_fdj_;KDs##Qh*2L{Mr}K{^hH zgLZ?ZlfGXi3=&4}<%8}8d3FzG?Epd`A(oJ{vM_mdeM^s-8z^Zlz0&#_{nkh@5bOje z!F?|t{6hyLEF{PXA%swZnvfyna|<7xose*{vIE(PD$i%9n@-U0=LxlhZbA>Ck6?xG zZTz5x{1EbtG_$aZ5JN~LB!x-^vos1(tU}C}sDg#)9p*tHbi?VP>8@e)+nkFL3Mc>p$>4K9}p9*+k+9uEQh0Eoq6 zC=?1z3*tk{wbO!J5c;`svBf-8+SI?>;~D$r+9H@+4HG=~f;@8*DM3e=uMLx|UX~vp z?oq^}rDqJ)wKZsMYk|`-jA`U9N_ilpK|%=lJor(x85wbs^+zyZb-+ll*j9ak&r)$lAdogh~UzciYj@WkIWvoJ=Tz zP7{I<5fCZkps3zttZeRkhn{ta&@|Bk?na*ZcrYVQ23)Z?BYcfMGn-e}1q}TV^7KNzuCii&YS@dZ*|P%b4Q><_AML z8Ut|j*dYW7{g9Wf$H~$L^!6F2O#0Rlu9P7`89)oLKr9p?F+vWVT7WMuT&?NuHM0er zgfA!D7DmS-&wf)73glw`ub)|*nbU=M9653T9FGHYW~Slz`5Ktb<{SUO<@&+x_TY{6 zkHToO;(z{j_{MLO8PlW^=p!V!)MA2?KF6!&h>H+o+gIQ1peXb%O{u^*?lT^Fmgbqe zJi9zE`j?W}xqc<37tzvGhkq%|#;J=9F!uNRtQIQ6wl|-F(>aQDn|9*Jj$fhAG>9i& z*oy6cT!Xd_BVO3J-MfJ&8lj3H=puq~rm_pE@oGdXgJE`ihL4@C-awbXATW(|ll8|V z&#bGT^zV=2If#djGk-vmgHc zT!bm5-tR2FZ~gcP(vvlK}_nar|86db<2MdG6fxvy7Yw?A!kt=Hw)ysl$qn&JORSw>CV6?p5l$EGb` zqP4@ff%SRTK23@+^7-bLE@Wt<5vz^D`#TT) zoi4HXUybj%&aLE`Zh0&{TK;BAW`0n0QwM5mDv&p87K%@w^IDyau#jN9xA_^bg`3;^ zuxkBZZ?mc_I1oFx{G0c0bwd|k+O!>(!QlzXivs*HGhIv3tQtAG80eD|@cEH5wI;J| z9ek1JhU?r)o@w#5g=w1S!}SaOjvUmW)U_n$xA8>jG2wyyFNskHj?D53vE|@F0*t&I^O!#a*8T;xF{6<;^mJ} z*W5EMiFvt+_|4j-;L|>sM(*?Ex({%nqIE*@QRMHEU7GBq zSJW^Ij9n+sh)*LdASv+bih0>F4sjg5+P4d{vr~y&JB3GITu)65$CFEDAuUPcjVv#} z^95P7Wn2<$q0c{E=yj>fwH^4&&LXsTnIMHUW#n0?kP?yXg7nBuiE@5+uSX7te+a($c0USoXQJ#%1#Ck%`|FlhS3(;dO2nJ+ z+Lo`!CGnR{ParBh1g9t)Z+`Ea2}xfc3W)#-Iz295E<-_jGIUAta1VETN~#TeE>*U^ zO;hR!w(Iq$IxZ~uDavL)ca3qQvr-a?yc7oye~a0=;F$kdJqF6yfv3<+t)2cgVy7=u*;AT6zI`|rf} zrZFu@gc$8~R9wD@d0DB5Po0gJ&@r65RMmO(rA7-2DCwOA;a@jzx0 zR}`9nJ)iACdXg4heZA;4ns0gl+k~vO@wYdggg=jIc7Kw){@!agyVLtt`UY%x{`EcH zx%5`O8+>M36t-@B3_tz#4pcRCdl&1vMFT~I1R+Enhlct}JUEN;iCl~Q`*u2<&Jk8J zZX+=Nw_M+_EIGv!RuXhBKTx-m`IOcY%U)=-G*gyMG z$#H6UxMEm(JCL7OfB`Daj~+k7V)a(|WHKY;yfw}z6W+&+I!J8&(%$Mp8INM%|R`JoG<)-v2vS z(S|>KTzu0#=jLUjuCWa={wT8NJc8Q#O814*GDe&gDK{j-t>l^eY)p<)uGYrJ^4g6i z)KRgKovI_tR!t~z1pz!N{it%dr8r5~sqyU690)0UetDt_M@#BaI5Ppu9@N7+-;=;q330l-m8@TlrSp=JpC0Yq2Ol5!4sG3L1kgej7CwlgGbM$CCVytm5 ztb?{U=<)~fHEVB-@yN6O<8lgvuRV~N9IuuMP+ZxH0gD|Ou}ai;50JI2QzFhb=lZAf zDdY|!LKy@(y@5Wn9la(S6jBj>|Bo|>jZh#iF&!t0i;)o{NBZ2Kpr*cV>}2slmXMg$ z*$QvkOyiMfA}x;apJ5^LC$e?10TTZae0r(|!IB`VH3L!BVuX1T^7f_&QBD}6a2Q7g z_L^l`*s{9>9lciX@1Y6_@^WY6$f**toCC`rSpd60hh00i7#$7=lLO4^w`I6Hbq|Ltxv*x76BQ!i3$4_5^({91?xyg_wEycyslChGrhb!Szkxcd3#=FPe znodmfu=e#!B9UlCUaBrgDWa@s>ZLu<1OEUa(zOu~dTgleFrkae!O1Lw`G0(*5*g_! zXl%El{K^%GNb)Y7qlZNMFfLbI!O5ci?c`$b(R3C+S+Ou~h?}Ta$(m1@gmnUea8Z6% zx+H|}gxg`piK=e&k?>Nf)X>MPNK=oXz1!&Bh?XHIMku_pq{b}FdX+K~TagheXf%;% z?lhyKx&an*KN7-%v3Oo4oQgRpD?5*~rw?`!@sHv2^H$uYXFr)PF^fK|!g`L!<1Na` z$d*M(IUF&psJYsQinak*Nr(jo20I!{pN7#EE^Lx|%Z9+WX|1#aW;7u6@MG_UG9KP9gl1urxvwr_P?9 z$dge)!*vaywa0>nZmaiA42_KcJl5_G7V!~A*)%;tg(z(boZ?gphmAO0{Pl>{I>1g! zcEHzQYQ-c@Nv3i#!uCKkeA4+*4#!WQpiPsc=(OB0(J(j;BSwd9u-k`VvN>TNA-ADD z;LqbgO2vgr5rjbbGz6+rU~wx@Po%#qEpizQ?JNYIChUT*H_!T#lS<=LJ(IfL_D+K@ zl+Gi>$>mCMbW9R2TodOf6>;F|sf02j5`)HWgr_dTFsTtkuNgfgaXYUzd77K6MjgX; zc7($s3hTumAvEBYj@Z2>|NTX9M>!|Yp25sH%dq{U zx81Y}Syp4|o#_jvuUR2o0^gw;3x!jTxA)>4mYoc;V@!6)#`->b!rTRgk7x~D4Q>xN z&{emS(vpiSbJ@9P0Txt`*8x!jyNAzhlQ{7 -
-
+
+
+
+
+ + +
+ +
+
+ + +
+
@@ -87,14 +126,19 @@ import SkillVP from './components/SkillVP' import SkillUP from './components/SkillUP' import { useConfigStore } from '@/stores' import SkillDetail from './components/SkillDetail' +import DarkKnightSkillSetting from './components/DarkKnightSkillSetting/index.vue' import { onClickOutside } from '@vueuse/core' -const props = defineProps<{ +defineProps<{ alter: string }>() const tab = ref(0) const infoStore = useInfoStore() const configStore = useConfigStore() +const skillTreeWidth = 550 + +const showDarkKnightSkillSetting = computed(() => infoStore.infos?.alter === 'dark_knight') + const curSkillId = ref() const curCurrentSkill = computed(() => { @@ -110,11 +154,15 @@ const showSkillDetail = ref(false) const skillTreeRef = ref() const SkillDetailRef = ref() +const detailButtonStyle = computed(() => ({ + left: `${skillTreeRef.value?.clientWidth ?? skillTreeWidth}px`, +})) + const style = computed(() => { return { zIndex: 99, height: `${skillTreeRef.value?.clientHeight ?? 0}px`, - left: `${(skillTreeRef.value?.clientWidth ?? 0) + 5}px`, + left: `${(skillTreeRef.value?.clientWidth ?? skillTreeWidth) + 5}px`, } }) @@ -122,9 +170,15 @@ const setCurrentSkill = (skillId: number) => { curSkillId.value = infoStore.skills.find((skill) => skill.id === skillId)?.uuid || '' } -onClickOutside(SkillDetailRef, (event) => {showSkillDetail.value = false}, { - ignore: [skillTreeRef], -}) +onClickOutside( + SkillDetailRef, + () => { + showSkillDetail.value = false + }, + { + ignore: [skillTreeRef], + }, +)