new:添加缔造者
This commit is contained in:
@@ -38,6 +38,7 @@ class CharacterInfoMixin(CharacterBase):
|
|||||||
'maxLearnLv': skill.calculate_lv(),
|
'maxLearnLv': skill.calculate_lv(),
|
||||||
'maxLv': skill.maxLv,
|
'maxLv': skill.maxLv,
|
||||||
'position': skill.position,
|
'position': skill.position,
|
||||||
|
'cellPosition': skill.cellPos,
|
||||||
'line': skill.line,
|
'line': skill.line,
|
||||||
'bind': skill.bind,
|
'bind': skill.bind,
|
||||||
'hasVP': skill.hasVP,
|
'hasVP': skill.hasVP,
|
||||||
|
|||||||
@@ -5,10 +5,20 @@ from core.basic.character import Character
|
|||||||
prefix = "extra/creator/cn/skillDetail"
|
prefix = "extra/creator/cn/skillDetail"
|
||||||
|
|
||||||
|
|
||||||
|
class CreatorActiveSkill(ActiveSkill):
|
||||||
|
"""缔造者技能按对应系列的满能量计算伤害。"""
|
||||||
|
|
||||||
|
energyCost = 100
|
||||||
|
totalEnergy = 100
|
||||||
|
|
||||||
|
def getSkillData(self, lv: int = 0):
|
||||||
|
return super().getSkillData(lv) * self.totalEnergy / self.energyCost
|
||||||
|
|
||||||
|
|
||||||
# 烈火燎原
|
# 烈火燎原
|
||||||
# extra/creator/527cdc3ecca985e18ef819d456532b26
|
# extra/creator/527cdc3ecca985e18ef819d456532b26
|
||||||
# b522a95d819a5559b775deb9a490e49a/527cdc3ecca985e18ef819d456532b26
|
# b522a95d819a5559b775deb9a490e49a/527cdc3ecca985e18ef819d456532b26
|
||||||
class Skill0(PassiveSkill):
|
class Skill0(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
从地表生成火焰攻击敌人。\n
|
从地表生成火焰攻击敌人。\n
|
||||||
按住鼠标左键的状态下拖动鼠标,即可根据鼠标移动轨迹生成火墙。\n
|
按住鼠标左键的状态下拖动鼠标,即可根据鼠标移动轨迹生成火墙。\n
|
||||||
@@ -31,6 +41,8 @@ class Skill0(PassiveSkill):
|
|||||||
# 火焰攻击力 : {value0}
|
# 火焰攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 1
|
hit0 = 1
|
||||||
|
energyCost = 4
|
||||||
|
totalEnergy = 140
|
||||||
# 能量消耗值 : {value1}
|
# 能量消耗值 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# [范围信息]
|
# [范围信息]
|
||||||
@@ -40,7 +52,7 @@ class Skill0(PassiveSkill):
|
|||||||
# 炽炎星陨
|
# 炽炎星陨
|
||||||
# extra/creator/902a016f6978f13740f237e4740a5646
|
# extra/creator/902a016f6978f13740f237e4740a5646
|
||||||
# b522a95d819a5559b775deb9a490e49a/902a016f6978f13740f237e4740a5646
|
# b522a95d819a5559b775deb9a490e49a/902a016f6978f13740f237e4740a5646
|
||||||
class Skill1(PassiveSkill):
|
class Skill1(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
召唤燃烧烈焰的陨石攻击敌人。\n
|
召唤燃烧烈焰的陨石攻击敌人。\n
|
||||||
陨石将掉落在鼠标点击的位置。\n
|
陨石将掉落在鼠标点击的位置。\n
|
||||||
@@ -63,6 +75,8 @@ class Skill1(PassiveSkill):
|
|||||||
# 陨石攻击力 : {value0}
|
# 陨石攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 1
|
hit0 = 1
|
||||||
|
energyCost = 20
|
||||||
|
totalEnergy = 140
|
||||||
# 能量消耗值 : {value1}
|
# 能量消耗值 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# [范围信息]
|
# [范围信息]
|
||||||
@@ -201,7 +215,7 @@ class Skill6(PassiveSkill):
|
|||||||
# 冰霜之球
|
# 冰霜之球
|
||||||
# extra/creator/370586038cf40378f20d338d507a780c
|
# extra/creator/370586038cf40378f20d338d507a780c
|
||||||
# b522a95d819a5559b775deb9a490e49a/370586038cf40378f20d338d507a780c
|
# b522a95d819a5559b775deb9a490e49a/370586038cf40378f20d338d507a780c
|
||||||
class Skill7(PassiveSkill):
|
class Skill7(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
生成冰霜之球,按角色面对方向滚向敌人。\n
|
生成冰霜之球,按角色面对方向滚向敌人。\n
|
||||||
冰球在鼠标点击的位置生成。\n
|
冰球在鼠标点击的位置生成。\n
|
||||||
@@ -224,6 +238,8 @@ class Skill7(PassiveSkill):
|
|||||||
# 冰球攻击力 : {value0}
|
# 冰球攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 6
|
hit0 = 6
|
||||||
|
energyCost = 20
|
||||||
|
totalEnergy = 140
|
||||||
# 冰球多段攻击次数 : {value1}次
|
# 冰球多段攻击次数 : {value1}次
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# 能量消耗值 : {value2}
|
# 能量消耗值 : {value2}
|
||||||
@@ -235,7 +251,7 @@ class Skill7(PassiveSkill):
|
|||||||
# 冰天震地
|
# 冰天震地
|
||||||
# extra/creator/fa3ee243b36699e9d3fc34328adf6417
|
# extra/creator/fa3ee243b36699e9d3fc34328adf6417
|
||||||
# b522a95d819a5559b775deb9a490e49a/fa3ee243b36699e9d3fc34328adf6417
|
# b522a95d819a5559b775deb9a490e49a/fa3ee243b36699e9d3fc34328adf6417
|
||||||
class Skill8(PassiveSkill):
|
class Skill8(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
生成巨大的冰盘砸向敌人。\n
|
生成巨大的冰盘砸向敌人。\n
|
||||||
冰盘将砸落在鼠标点击的位置。\n
|
冰盘将砸落在鼠标点击的位置。\n
|
||||||
@@ -258,6 +274,8 @@ class Skill8(PassiveSkill):
|
|||||||
# 冰盘攻击力 : {value0}
|
# 冰盘攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 1
|
hit0 = 1
|
||||||
|
energyCost = 40
|
||||||
|
totalEnergy = 140
|
||||||
# 能量消耗值 : {value1}
|
# 能量消耗值 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# [范围信息]
|
# [范围信息]
|
||||||
@@ -523,7 +541,7 @@ class Skill17(PassiveSkill):
|
|||||||
# 烈焰飓风
|
# 烈焰飓风
|
||||||
# extra/creator/e788de1a4498c99fcc790302c4d41fed
|
# extra/creator/e788de1a4498c99fcc790302c4d41fed
|
||||||
# b522a95d819a5559b775deb9a490e49a/e788de1a4498c99fcc790302c4d41fed
|
# b522a95d819a5559b775deb9a490e49a/e788de1a4498c99fcc790302c4d41fed
|
||||||
class Skill18(PassiveSkill):
|
class Skill18(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
以自身为中心,生成烈焰飓风。\n
|
以自身为中心,生成烈焰飓风。\n
|
||||||
施放过程中可以自由移动。 按跳跃键时,可以强制中断该技能。\n
|
施放过程中可以自由移动。 按跳跃键时,可以强制中断该技能。\n
|
||||||
@@ -548,6 +566,8 @@ class Skill18(PassiveSkill):
|
|||||||
# 烈焰飓风攻击力 : {value0}
|
# 烈焰飓风攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 12
|
hit0 = 12
|
||||||
|
energyCost = 60
|
||||||
|
totalEnergy = 140
|
||||||
# 烈焰飓风多段攻击次数 : {value1}次
|
# 烈焰飓风多段攻击次数 : {value1}次
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# 能量消耗值: {value2}
|
# 能量消耗值: {value2}
|
||||||
@@ -578,7 +598,7 @@ class Skill18(PassiveSkill):
|
|||||||
# 极冰护盾
|
# 极冰护盾
|
||||||
# extra/creator/dd32a9825ec1af42a91f2223be6658e5
|
# extra/creator/dd32a9825ec1af42a91f2223be6658e5
|
||||||
# b522a95d819a5559b775deb9a490e49a/dd32a9825ec1af42a91f2223be6658e5
|
# b522a95d819a5559b775deb9a490e49a/dd32a9825ec1af42a91f2223be6658e5
|
||||||
class Skill19(PassiveSkill):
|
class Skill19(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
生成极冰护盾。\n
|
生成极冰护盾。\n
|
||||||
生成时,攻击周围敌人并击退敌人。\n
|
生成时,攻击周围敌人并击退敌人。\n
|
||||||
@@ -608,6 +628,8 @@ class Skill19(PassiveSkill):
|
|||||||
# 护盾攻击力 : {value2}
|
# 护盾攻击力 : {value2}
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
hit2 = 1
|
hit2 = 1
|
||||||
|
energyCost = 60
|
||||||
|
totalEnergy = 140
|
||||||
# 推开距离 : {value3}px
|
# 推开距离 : {value3}px
|
||||||
data3 = get_data(f'{prefix}/{uuid}', 3)
|
data3 = get_data(f'{prefix}/{uuid}', 3)
|
||||||
# 能量消耗值 : {value4}
|
# 能量消耗值 : {value4}
|
||||||
@@ -626,7 +648,7 @@ class Skill19(PassiveSkill):
|
|||||||
总攻击力 +133%\n
|
总攻击力 +133%\n
|
||||||
护盾大小 +40%\n
|
护盾大小 +40%\n
|
||||||
"""
|
"""
|
||||||
...
|
self.energyCost = 140
|
||||||
|
|
||||||
def vp_2(self):
|
def vp_2(self):
|
||||||
"""
|
"""
|
||||||
@@ -694,7 +716,7 @@ class Skill21(ActiveSkill):
|
|||||||
# 超能旋风波
|
# 超能旋风波
|
||||||
# extra/creator/5197b141332a65a89d452adf227c2f30
|
# extra/creator/5197b141332a65a89d452adf227c2f30
|
||||||
# b522a95d819a5559b775deb9a490e49a/5197b141332a65a89d452adf227c2f30
|
# b522a95d819a5559b775deb9a490e49a/5197b141332a65a89d452adf227c2f30
|
||||||
class Skill22(PassiveSkill):
|
class Skill22(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
聚集超能旋风的力量,向前方快速发射旋风波。\n
|
聚集超能旋风的力量,向前方快速发射旋风波。\n
|
||||||
按住左键的状态下拖动鼠标,即可向指定方向发射旋风波。\n
|
按住左键的状态下拖动鼠标,即可向指定方向发射旋风波。\n
|
||||||
@@ -719,6 +741,8 @@ class Skill22(PassiveSkill):
|
|||||||
# 旋风波攻击力 : {value0}
|
# 旋风波攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 1
|
hit0 = 1
|
||||||
|
energyCost = 4
|
||||||
|
totalEnergy = 140
|
||||||
# 能量消耗值 : {value1}
|
# 能量消耗值 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# [范围信息]
|
# [范围信息]
|
||||||
@@ -742,12 +766,12 @@ class Skill22(PassiveSkill):
|
|||||||
- 总攻击力相同\n
|
- 总攻击力相同\n
|
||||||
- 不适用[创世]效果\n
|
- 不适用[创世]效果\n
|
||||||
"""
|
"""
|
||||||
...
|
self.energyCost = 35
|
||||||
|
|
||||||
# 风暴漩涡
|
# 风暴漩涡
|
||||||
# extra/creator/75747c67e14eec6088ce67f63ea41628
|
# extra/creator/75747c67e14eec6088ce67f63ea41628
|
||||||
# b522a95d819a5559b775deb9a490e49a/75747c67e14eec6088ce67f63ea41628
|
# b522a95d819a5559b775deb9a490e49a/75747c67e14eec6088ce67f63ea41628
|
||||||
class Skill23(PassiveSkill):
|
class Skill23(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
生成风暴。\n
|
生成风暴。\n
|
||||||
可将敌人吸附到风暴中心。\n
|
可将敌人吸附到风暴中心。\n
|
||||||
@@ -773,6 +797,8 @@ class Skill23(PassiveSkill):
|
|||||||
# 风暴攻击力 : {value0}
|
# 风暴攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 1
|
hit0 = 1
|
||||||
|
energyCost = 20
|
||||||
|
totalEnergy = 140
|
||||||
# 能量消耗值 : {value1}
|
# 能量消耗值 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# [范围信息]
|
# [范围信息]
|
||||||
@@ -798,7 +824,7 @@ class Skill23(PassiveSkill):
|
|||||||
- 总攻击力相同\n
|
- 总攻击力相同\n
|
||||||
- 不适用[创世]效果\n
|
- 不适用[创世]效果\n
|
||||||
"""
|
"""
|
||||||
...
|
self.energyCost = 70
|
||||||
|
|
||||||
# 风暴
|
# 风暴
|
||||||
# extra/creator/d204ec03a0aed2f20211fb6ccc48d46d
|
# extra/creator/d204ec03a0aed2f20211fb6ccc48d46d
|
||||||
@@ -915,7 +941,7 @@ class Skill27(ActiveSkill):
|
|||||||
# 末日虫洞
|
# 末日虫洞
|
||||||
# extra/creator/dec8961c485edb02036ba00c789010f0
|
# extra/creator/dec8961c485edb02036ba00c789010f0
|
||||||
# b522a95d819a5559b775deb9a490e49a/dec8961c485edb02036ba00c789010f0
|
# b522a95d819a5559b775deb9a490e49a/dec8961c485edb02036ba00c789010f0
|
||||||
class Skill28(PassiveSkill):
|
class Skill28(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
生成虫洞,连接阿拉德最后的时空。\n
|
生成虫洞,连接阿拉德最后的时空。\n
|
||||||
在鼠标点击位置生成虫洞。\n
|
在鼠标点击位置生成虫洞。\n
|
||||||
@@ -947,6 +973,8 @@ class Skill28(PassiveSkill):
|
|||||||
# 虫洞大爆炸攻击力 : {value2}
|
# 虫洞大爆炸攻击力 : {value2}
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
hit2 = 1
|
hit2 = 1
|
||||||
|
energyCost = 100
|
||||||
|
totalEnergy = 100
|
||||||
# 能量消耗值 : {value3}
|
# 能量消耗值 : {value3}
|
||||||
data3 = get_data(f'{prefix}/{uuid}', 3)
|
data3 = get_data(f'{prefix}/{uuid}', 3)
|
||||||
# [范围信息]
|
# [范围信息]
|
||||||
@@ -960,7 +988,7 @@ class Skill28(PassiveSkill):
|
|||||||
单次攻击力 -50%\n
|
单次攻击力 -50%\n
|
||||||
施放时强力吸附范围内敌人\n
|
施放时强力吸附范围内敌人\n
|
||||||
"""
|
"""
|
||||||
...
|
self.energyCost = 50
|
||||||
|
|
||||||
def vp_2(self):
|
def vp_2(self):
|
||||||
"""
|
"""
|
||||||
@@ -1002,7 +1030,7 @@ class Skill29(ActiveSkill):
|
|||||||
# 冰雪降临
|
# 冰雪降临
|
||||||
# extra/creator/d8ff976e2aaa4720272a5175d1eb9126
|
# extra/creator/d8ff976e2aaa4720272a5175d1eb9126
|
||||||
# b522a95d819a5559b775deb9a490e49a/d8ff976e2aaa4720272a5175d1eb9126
|
# b522a95d819a5559b775deb9a490e49a/d8ff976e2aaa4720272a5175d1eb9126
|
||||||
class Skill30(PassiveSkill):
|
class Skill30(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
重现冰河时代的酷寒地带。\n
|
重现冰河时代的酷寒地带。\n
|
||||||
使领域内的敌人进行减速状态。\n
|
使领域内的敌人进行减速状态。\n
|
||||||
@@ -1030,6 +1058,8 @@ class Skill30(PassiveSkill):
|
|||||||
# 冰河地带攻击力 : {value0}
|
# 冰河地带攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 21
|
hit0 = 21
|
||||||
|
energyCost = 50
|
||||||
|
totalEnergy = 100
|
||||||
# 冰河地带多段攻击次数 : {value1}次
|
# 冰河地带多段攻击次数 : {value1}次
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# 不同范围的攻击力增加率 : 0%~{value2}%
|
# 不同范围的攻击力增加率 : 0%~{value2}%
|
||||||
@@ -1059,7 +1089,8 @@ class Skill30(PassiveSkill):
|
|||||||
- 总攻击力相同\n
|
- 总攻击力相同\n
|
||||||
不适用不同范围的攻击力增加率效果\n
|
不适用不同范围的攻击力增加率效果\n
|
||||||
"""
|
"""
|
||||||
...
|
self.hit0 = 1
|
||||||
|
self.energyCost = 2
|
||||||
|
|
||||||
def vp_2(self):
|
def vp_2(self):
|
||||||
"""
|
"""
|
||||||
@@ -1099,7 +1130,7 @@ class Skill31(ActiveSkill):
|
|||||||
# 时空链接
|
# 时空链接
|
||||||
# extra/creator/394e2f09c1f37ae61d831d8567707170
|
# extra/creator/394e2f09c1f37ae61d831d8567707170
|
||||||
# b522a95d819a5559b775deb9a490e49a/394e2f09c1f37ae61d831d8567707170
|
# b522a95d819a5559b775deb9a490e49a/394e2f09c1f37ae61d831d8567707170
|
||||||
class Skill32(PassiveSkill):
|
class Skill32(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
在空地点击鼠标左键可以召唤时间妖精“卡巴拉”实现连接。\n
|
在空地点击鼠标左键可以召唤时间妖精“卡巴拉”实现连接。\n
|
||||||
点击右键会跟被连接的角色以红色实线连接。\n
|
点击右键会跟被连接的角色以红色实线连接。\n
|
||||||
@@ -1126,6 +1157,8 @@ class Skill32(PassiveSkill):
|
|||||||
# 红色实线攻击力 : {value0}
|
# 红色实线攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 35
|
hit0 = 35
|
||||||
|
energyCost = 50
|
||||||
|
totalEnergy = 100
|
||||||
# 红色实线多段攻击次数 : {value1}次
|
# 红色实线多段攻击次数 : {value1}次
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
# [时空链接]连接线持续时间 : {value2}秒
|
# [时空链接]连接线持续时间 : {value2}秒
|
||||||
@@ -1159,7 +1192,8 @@ class Skill32(PassiveSkill):
|
|||||||
- 连接2名队友时,所受伤害 -10%\n
|
- 连接2名队友时,所受伤害 -10%\n
|
||||||
- 连接3名队友时,所受伤害 -15%\n
|
- 连接3名队友时,所受伤害 -15%\n
|
||||||
"""
|
"""
|
||||||
...
|
self.hit0 = 70
|
||||||
|
self.energyCost = 100
|
||||||
|
|
||||||
# 创世之力
|
# 创世之力
|
||||||
# extra/creator/9376d04c476cd41d60ed1974ca69ab95
|
# extra/creator/9376d04c476cd41d60ed1974ca69ab95
|
||||||
@@ -1217,7 +1251,7 @@ class Skill34(ActiveSkill):
|
|||||||
# 时空禁制
|
# 时空禁制
|
||||||
# extra/creator/bae12a6dc7d22a5cf149673e88ddda28
|
# extra/creator/bae12a6dc7d22a5cf149673e88ddda28
|
||||||
# b522a95d819a5559b775deb9a490e49a/bae12a6dc7d22a5cf149673e88ddda28
|
# b522a95d819a5559b775deb9a490e49a/bae12a6dc7d22a5cf149673e88ddda28
|
||||||
class Skill35(PassiveSkill):
|
class Skill35(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
通过时间妖精“卡巴拉”之力,使时间加速,限制周围目标行动。\n
|
通过时间妖精“卡巴拉”之力,使时间加速,限制周围目标行动。\n
|
||||||
在鼠标左键点击的位置召唤“卡巴拉”,在持续时间内强制控制敌人,最后随着爆炸消失。\n
|
在鼠标左键点击的位置召唤“卡巴拉”,在持续时间内强制控制敌人,最后随着爆炸消失。\n
|
||||||
@@ -1247,6 +1281,8 @@ class Skill35(PassiveSkill):
|
|||||||
# 卡巴拉爆炸攻击力 : {value2}
|
# 卡巴拉爆炸攻击力 : {value2}
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
hit2 = 1
|
hit2 = 1
|
||||||
|
energyCost = 100
|
||||||
|
totalEnergy = 100
|
||||||
# 卡巴拉召唤持续时间 : {value3}秒
|
# 卡巴拉召唤持续时间 : {value3}秒
|
||||||
data3 = get_data(f'{prefix}/{uuid}', 3)
|
data3 = get_data(f'{prefix}/{uuid}', 3)
|
||||||
# 能量消耗值 : {value4}
|
# 能量消耗值 : {value4}
|
||||||
@@ -1366,7 +1402,7 @@ class Skill37(PassiveSkill):
|
|||||||
# 生命之树
|
# 生命之树
|
||||||
# extra/creator/66a9967e677651d0def34c475795ccde
|
# extra/creator/66a9967e677651d0def34c475795ccde
|
||||||
# b522a95d819a5559b775deb9a490e49a/66a9967e677651d0def34c475795ccde
|
# b522a95d819a5559b775deb9a490e49a/66a9967e677651d0def34c475795ccde
|
||||||
class Skill38(PassiveSkill):
|
class Skill38(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
召唤蕴含创世之力的卡巴拉,创造出长有烈炎、 寒冰、 风暴之果实的生命之树并使其爆炸。\n
|
召唤蕴含创世之力的卡巴拉,创造出长有烈炎、 寒冰、 风暴之果实的生命之树并使其爆炸。\n
|
||||||
可以通过按住鼠标左键拖拽或右键点击,使元素果实向指定的位置投掷或爆炸。\n
|
可以通过按住鼠标左键拖拽或右键点击,使元素果实向指定的位置投掷或爆炸。\n
|
||||||
@@ -1392,10 +1428,13 @@ class Skill38(PassiveSkill):
|
|||||||
|
|
||||||
# 每个元素果实爆炸攻击力 : {value0}
|
# 每个元素果实爆炸攻击力 : {value0}
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 0
|
hit0 = 6
|
||||||
|
power0 = 1 / 1.07 #TODO:CHECK
|
||||||
# 元素果实同时爆炸攻击力 : {value1} X 剩余果实数
|
# 元素果实同时爆炸攻击力 : {value1} X 剩余果实数
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
hit1 = 6
|
hit1 = 0
|
||||||
|
energyCost = 100
|
||||||
|
totalEnergy = 100
|
||||||
# 能量消耗值 : {value2}
|
# 能量消耗值 : {value2}
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
|
|
||||||
@@ -1403,11 +1442,13 @@ class Skill38(PassiveSkill):
|
|||||||
|
|
||||||
def setMode(self, mode):
|
def setMode(self, mode):
|
||||||
if mode == '秒炸':
|
if mode == '秒炸':
|
||||||
self.hit0 = 0
|
self.hit0 = 6
|
||||||
self.hit1 = 6
|
self.hit1 = 0
|
||||||
|
self.power0 = 0.9 #TODO:CHECK
|
||||||
elif mode == '常规':
|
elif mode == '常规':
|
||||||
self.hit0 = 6
|
self.hit0 = 6
|
||||||
self.hit1 = 0
|
self.hit1 = 0
|
||||||
|
self.power0 = 1 / 1.07 #TODO:CHECK
|
||||||
|
|
||||||
# 天工开物
|
# 天工开物
|
||||||
# extra/creator/8eeca98333667959c403104f6d24da34
|
# extra/creator/8eeca98333667959c403104f6d24da34
|
||||||
@@ -1472,7 +1513,7 @@ class Skill40(ActiveSkill):
|
|||||||
# 创世之光
|
# 创世之光
|
||||||
# extra/creator/bcbaa4338139bc9342c8a8415dfbe39a
|
# extra/creator/bcbaa4338139bc9342c8a8415dfbe39a
|
||||||
# b522a95d819a5559b775deb9a490e49a/bcbaa4338139bc9342c8a8415dfbe39a
|
# b522a95d819a5559b775deb9a490e49a/bcbaa4338139bc9342c8a8415dfbe39a
|
||||||
class Skill41(PassiveSkill):
|
class Skill41(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
发动创世神器的力量,生成与太初时间相连的魔法门。\n
|
发动创世神器的力量,生成与太初时间相连的魔法门。\n
|
||||||
魔法门持续期间内输入创生系列技能时,注入创世能量,立即引发爆炸。\n
|
魔法门持续期间内输入创生系列技能时,注入创世能量,立即引发爆炸。\n
|
||||||
@@ -1500,6 +1541,8 @@ class Skill41(PassiveSkill):
|
|||||||
# 太初之光爆炸攻击力 : {value1}
|
# 太初之光爆炸攻击力 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
hit1 = 1
|
hit1 = 1
|
||||||
|
energyCost = 100
|
||||||
|
totalEnergy = 100
|
||||||
# 能量消耗量 : {value2}
|
# 能量消耗量 : {value2}
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
|
|
||||||
@@ -1557,7 +1600,7 @@ class Skill43(ActiveSkill):
|
|||||||
# 时之终末 : 归烬
|
# 时之终末 : 归烬
|
||||||
# extra/creator/03bd172c9c50cfdcf9d7e83a3ef82842
|
# extra/creator/03bd172c9c50cfdcf9d7e83a3ef82842
|
||||||
# b522a95d819a5559b775deb9a490e49a/03bd172c9c50cfdcf9d7e83a3ef82842
|
# b522a95d819a5559b775deb9a490e49a/03bd172c9c50cfdcf9d7e83a3ef82842
|
||||||
class Skill44(PassiveSkill):
|
class Skill44(CreatorActiveSkill):
|
||||||
"""
|
"""
|
||||||
展开创世魔法书,对时间进行干涉,移动到时之终末。\n
|
展开创世魔法书,对时间进行干涉,移动到时之终末。\n
|
||||||
卡巴拉变成巨型钟表指向12点时,次元爆炸,湮灭敌人。\n
|
卡巴拉变成巨型钟表指向12点时,次元爆炸,湮灭敌人。\n
|
||||||
@@ -1589,6 +1632,8 @@ class Skill44(PassiveSkill):
|
|||||||
# 次元爆炸攻击力 : {value2}
|
# 次元爆炸攻击力 : {value2}
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
hit2 = 1
|
hit2 = 1
|
||||||
|
energyCost = 100
|
||||||
|
totalEnergy = 100
|
||||||
# 能量消耗量 : {value3}
|
# 能量消耗量 : {value3}
|
||||||
data3 = get_data(f'{prefix}/{uuid}', 3)
|
data3 = get_data(f'{prefix}/{uuid}', 3)
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,19 @@ from core.basic.character import Character
|
|||||||
prefix = "extra/dark_knight/cn/skillDetail"
|
prefix = "extra/dark_knight/cn/skillDetail"
|
||||||
|
|
||||||
|
|
||||||
|
def apply_weapon_mastery(skill: PassiveSkill, old: int, new: int, weapon_type: str):
|
||||||
|
weapon = skill.char.GetWeaponType()
|
||||||
|
if weapon[0] != weapon_type:
|
||||||
|
return None
|
||||||
|
|
||||||
|
physical = skill.char.输出类型.startswith('物理')
|
||||||
|
inherited = '传世武器' in weapon[1]
|
||||||
|
data_index = (3 if physical else 4) if inherited else (0 if physical else 1)
|
||||||
|
attack_type = '$*PAtkP' if physical else '$*PAtkM'
|
||||||
|
skill.associate = [{'type': attack_type, 'data': getattr(skill, f'data{data_index}')}]
|
||||||
|
return PassiveSkill.effect(skill, old, new)
|
||||||
|
|
||||||
|
|
||||||
# 暗影斩
|
# 暗影斩
|
||||||
# extra/dark_knight/eb71e1d82d92c7e1d40500a0dcd77aa6
|
# extra/dark_knight/eb71e1d82d92c7e1d40500a0dcd77aa6
|
||||||
# 17e417b31686389eebff6d754c3401ea/eb71e1d82d92c7e1d40500a0dcd77aa6
|
# 17e417b31686389eebff6d754c3401ea/eb71e1d82d92c7e1d40500a0dcd77aa6
|
||||||
@@ -174,6 +187,8 @@ class Skill5(PassiveSkill):
|
|||||||
# 跳跃攻击力变化率 : {value2}%
|
# 跳跃攻击力变化率 : {value2}%
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
|
|
||||||
|
associate = [{'type': '*skillDamage', 'data': [i - 100 if i > 0 else 0 for i in data0], 'skills': ['挑击']}]
|
||||||
|
|
||||||
# 受身蹲伏
|
# 受身蹲伏
|
||||||
# extra/dark_knight/ce26c6b69d02a440a81b552bec94f03b
|
# extra/dark_knight/ce26c6b69d02a440a81b552bec94f03b
|
||||||
# 17e417b31686389eebff6d754c3401ea/ce26c6b69d02a440a81b552bec94f03b
|
# 17e417b31686389eebff6d754c3401ea/ce26c6b69d02a440a81b552bec94f03b
|
||||||
@@ -630,14 +645,7 @@ class Skill19(PassiveSkill):
|
|||||||
data5 = get_data(f'{prefix}/{uuid}', 5)
|
data5 = get_data(f'{prefix}/{uuid}', 5)
|
||||||
|
|
||||||
def effect(self, old, new):
|
def effect(self, old, new):
|
||||||
weapon = self.char.GetWeaponType()
|
return apply_weapon_mastery(self, old, new, '光剑')
|
||||||
if weapon[0] != '光剑':
|
|
||||||
return None
|
|
||||||
data = self.data0
|
|
||||||
if '传世武器' in weapon[1]:
|
|
||||||
data = self.data3
|
|
||||||
self.associate = [{'type': '$*PAtkP', 'data': data}]
|
|
||||||
return super().effect(old, new)
|
|
||||||
|
|
||||||
# 暗 · 短剑精通
|
# 暗 · 短剑精通
|
||||||
# extra/dark_knight/01c3a2fb793d293a25ed8dc7a0d70c1a
|
# extra/dark_knight/01c3a2fb793d293a25ed8dc7a0d70c1a
|
||||||
@@ -676,14 +684,7 @@ class Skill20(PassiveSkill):
|
|||||||
data5 = get_data(f'{prefix}/{uuid}', 5)
|
data5 = get_data(f'{prefix}/{uuid}', 5)
|
||||||
|
|
||||||
def effect(self, old, new):
|
def effect(self, old, new):
|
||||||
weapon = self.char.GetWeaponType()
|
return apply_weapon_mastery(self, old, new, '短剑')
|
||||||
if weapon[0] != '短剑':
|
|
||||||
return None
|
|
||||||
data = self.data0
|
|
||||||
if '传世武器' in weapon[1]:
|
|
||||||
data = self.data3
|
|
||||||
self.associate = [{'type': '$*PAtkP', 'data': data}]
|
|
||||||
return super().effect(old, new)
|
|
||||||
|
|
||||||
# 暗 · 太刀精通
|
# 暗 · 太刀精通
|
||||||
# extra/dark_knight/8f73f243041c2d27739fe7696f02bf9b
|
# extra/dark_knight/8f73f243041c2d27739fe7696f02bf9b
|
||||||
@@ -722,14 +723,7 @@ class Skill21(PassiveSkill):
|
|||||||
data5 = get_data(f'{prefix}/{uuid}', 5)
|
data5 = get_data(f'{prefix}/{uuid}', 5)
|
||||||
|
|
||||||
def effect(self, old, new):
|
def effect(self, old, new):
|
||||||
weapon = self.char.GetWeaponType()
|
return apply_weapon_mastery(self, old, new, '太刀')
|
||||||
if weapon[0] != '太刀':
|
|
||||||
return None
|
|
||||||
data = self.data0
|
|
||||||
if '传世武器' in weapon[1]:
|
|
||||||
data = self.data3
|
|
||||||
self.associate = [{'type': '$*PAtkP', 'data': data}]
|
|
||||||
return super().effect(old, new)
|
|
||||||
|
|
||||||
# 暗 · 巨剑精通
|
# 暗 · 巨剑精通
|
||||||
# extra/dark_knight/8c2379737c5acc935c1731f67f607655
|
# extra/dark_knight/8c2379737c5acc935c1731f67f607655
|
||||||
@@ -768,14 +762,7 @@ class Skill22(PassiveSkill):
|
|||||||
data5 = get_data(f'{prefix}/{uuid}', 5)
|
data5 = get_data(f'{prefix}/{uuid}', 5)
|
||||||
|
|
||||||
def effect(self, old, new):
|
def effect(self, old, new):
|
||||||
weapon = self.char.GetWeaponType()
|
return apply_weapon_mastery(self, old, new, '巨剑')
|
||||||
if weapon[0] != '巨剑':
|
|
||||||
return None
|
|
||||||
data = self.data0
|
|
||||||
if '传世武器' in weapon[1]:
|
|
||||||
data = self.data3
|
|
||||||
self.associate = [{'type': '$*PAtkP', 'data': data}]
|
|
||||||
return super().effect(old, new)
|
|
||||||
|
|
||||||
# 暗 · 钝器精通
|
# 暗 · 钝器精通
|
||||||
# extra/dark_knight/9cb6f9ed646fa87f9b7680a42ce83d1a
|
# extra/dark_knight/9cb6f9ed646fa87f9b7680a42ce83d1a
|
||||||
@@ -814,14 +801,7 @@ class Skill23(PassiveSkill):
|
|||||||
data5 = get_data(f'{prefix}/{uuid}', 5)
|
data5 = get_data(f'{prefix}/{uuid}', 5)
|
||||||
|
|
||||||
def effect(self, old, new):
|
def effect(self, old, new):
|
||||||
weapon = self.char.GetWeaponType()
|
return apply_weapon_mastery(self, old, new, '钝器')
|
||||||
if weapon[0] != '钝器':
|
|
||||||
return None
|
|
||||||
data = self.data0
|
|
||||||
if '传世武器' in weapon[1]:
|
|
||||||
data = self.data3
|
|
||||||
self.associate = [{'type': '$*PAtkP', 'data': data}]
|
|
||||||
return super().effect(old, new)
|
|
||||||
|
|
||||||
# 暗劲爆发
|
# 暗劲爆发
|
||||||
# extra/dark_knight/506e7ed77d517419a6e1c437a2cedb17
|
# extra/dark_knight/506e7ed77d517419a6e1c437a2cedb17
|
||||||
@@ -1535,7 +1515,8 @@ class Skill41(ActiveSkill):
|
|||||||
斩击命中后,将瞬移到命中敌人中最强敌人的后方发动下一次斩击\n
|
斩击命中后,将瞬移到命中敌人中最强敌人的后方发动下一次斩击\n
|
||||||
施放动作赋予无敌状态\n
|
施放动作赋予无敌状态\n
|
||||||
"""
|
"""
|
||||||
...
|
self.hit0 = 8
|
||||||
|
self.power0 = 13 / 8 #TODO:CHECK
|
||||||
|
|
||||||
def vp_2(self):
|
def vp_2(self):
|
||||||
"""
|
"""
|
||||||
@@ -1592,7 +1573,7 @@ class Skill42(ActiveSkill):
|
|||||||
- 中断时,适用[时间停滞]能量5阶段的攻击力,且不消耗[时间停滞]能量\n
|
- 中断时,适用[时间停滞]能量5阶段的攻击力,且不消耗[时间停滞]能量\n
|
||||||
- 暗黑波动旋转速度 +100%\n
|
- 暗黑波动旋转速度 +100%\n
|
||||||
"""
|
"""
|
||||||
...
|
self.skillDamage *= 2
|
||||||
|
|
||||||
def vp_2(self):
|
def vp_2(self):
|
||||||
"""
|
"""
|
||||||
@@ -1721,9 +1702,9 @@ class Skill45(ActiveSkill):
|
|||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
# 多段攻击次数 : {value1}
|
# 多段攻击次数 : {value1}
|
||||||
data1 = get_data(f'{prefix}/{uuid}', 1)
|
data1 = get_data(f'{prefix}/{uuid}', 1)
|
||||||
hit1 = 33
|
|
||||||
# 多段攻击攻击力 : {value2}%
|
# 多段攻击攻击力 : {value2}%
|
||||||
data2 = get_data(f'{prefix}/{uuid}', 2)
|
data2 = get_data(f'{prefix}/{uuid}', 2)
|
||||||
|
hit2 = 33
|
||||||
# 最后一击爆炸攻击力 : {value3}%
|
# 最后一击爆炸攻击力 : {value3}%
|
||||||
data3 = get_data(f'{prefix}/{uuid}', 3)
|
data3 = get_data(f'{prefix}/{uuid}', 3)
|
||||||
hit3 = 1
|
hit3 = 1
|
||||||
@@ -1738,7 +1719,8 @@ class Skill45(ActiveSkill):
|
|||||||
- 总攻击力相同\n
|
- 总攻击力相同\n
|
||||||
幽魂剑范围 +30%\n
|
幽魂剑范围 +30%\n
|
||||||
"""
|
"""
|
||||||
...
|
self.hit2 = 6
|
||||||
|
self.power2 = 33 / 6 #TODO:CHECK
|
||||||
|
|
||||||
def vp_2(self):
|
def vp_2(self):
|
||||||
"""
|
"""
|
||||||
@@ -1966,7 +1948,7 @@ class Skill50(ActiveSkill):
|
|||||||
- 适用最高连击阶段的攻击力\n
|
- 适用最高连击阶段的攻击力\n
|
||||||
- 不恢复[时间停滞]连击能量\n
|
- 不恢复[时间停滞]连击能量\n
|
||||||
"""
|
"""
|
||||||
...
|
self.skillDamage *= 2
|
||||||
|
|
||||||
# 超时空碎裂
|
# 超时空碎裂
|
||||||
# extra/dark_knight/d204ec03a0aed2f20211fb6ccc48d46d
|
# extra/dark_knight/d204ec03a0aed2f20211fb6ccc48d46d
|
||||||
@@ -2130,6 +2112,7 @@ class Skill55(ActiveSkill):
|
|||||||
# 次元斩击攻击力 : {value0}%
|
# 次元斩击攻击力 : {value0}%
|
||||||
data0 = get_data(f'{prefix}/{uuid}', 0)
|
data0 = get_data(f'{prefix}/{uuid}', 0)
|
||||||
hit0 = 1
|
hit0 = 1
|
||||||
|
skillDamage = 2
|
||||||
|
|
||||||
class classChange(Character):
|
class classChange(Character):
|
||||||
def __init__(self, equVersion):
|
def __init__(self, equVersion):
|
||||||
@@ -2143,10 +2126,10 @@ class classChange(Character):
|
|||||||
self.jobGrowId = '0a49d9c8b5e1358efff324e5cb11d41e'
|
self.jobGrowId = '0a49d9c8b5e1358efff324e5cb11d41e'
|
||||||
|
|
||||||
self.武器选项 = ['光剑', '太刀', '钝器', '巨剑', '短剑'] # TODO
|
self.武器选项 = ['光剑', '太刀', '钝器', '巨剑', '短剑'] # TODO
|
||||||
self.输出类型选项 = [] # TODO
|
self.输出类型选项 = ['物理百分比', '魔法百分比']
|
||||||
self.输出类型 = '' # TODO
|
self.输出类型 = '物理百分比'
|
||||||
self.防具精通属性 = [''] # TODO
|
self.防具精通属性 = ['力量', '智力']
|
||||||
self.防具类型 = ''
|
self.防具类型 = '轻甲'
|
||||||
self.buff = 1.598 # TODO
|
self.buff = 1.598 # TODO
|
||||||
|
|
||||||
super().__init__(equVersion, __name__)
|
super().__init__(equVersion, __name__)
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ adv = [
|
|||||||
'name': 'extra',
|
'name': 'extra',
|
||||||
'title': '外传',
|
'title': '外传',
|
||||||
'children': [
|
'children': [
|
||||||
{'id': 0, 'name': 'creator', 'title': '知源·缔造者', 'open': False},
|
{'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': False},
|
||||||
{'id': 2, 'name': 'empty', 'title': ''},
|
{'id': 2, 'name': 'empty', 'title': ''},
|
||||||
{'id': 3, 'name': 'empty', 'title': ''},
|
{'id': 3, 'name': 'empty', 'title': ''},
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ export interface ISkill {
|
|||||||
name: string
|
name: string
|
||||||
desc: string
|
desc: string
|
||||||
}[]
|
}[]
|
||||||
|
cellPosition: number[]
|
||||||
uuid: string
|
uuid: string
|
||||||
upType: 'damage' | 'heal'
|
upType: 'damage' | 'heal'
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
@@ -1,9 +1,13 @@
|
|||||||
import { getImageURL, getLocalImageURL } from '@/utils/images'
|
import { getImageURL } from '@/utils/images'
|
||||||
import type { ISkill } from '@/api/info/type'
|
import type { ISkill } from '@/api/info/type'
|
||||||
import { useVModel } from '@vueuse/core'
|
import { useVModel } from '@vueuse/core'
|
||||||
import CalcButton from '@/components/calc/button/index.vue'
|
import CalcButton from '@/components/calc/button/index.vue'
|
||||||
import './style.scss'
|
import './style.scss'
|
||||||
|
|
||||||
|
const rowPrefixes = ['通用', 1, '', 10, '', 20, '', 30, '', 40, 50, 60, 70, 80, 90, 100]
|
||||||
|
const defaultColumnCount = 11
|
||||||
|
const altersWithoutRowPrefix = new Set(['creator', 'dark_knight'])
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'SkillTree',
|
name: 'SkillTree',
|
||||||
props: {
|
props: {
|
||||||
@@ -19,34 +23,73 @@ export default defineComponent({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: () => 50,
|
default: () => 50,
|
||||||
},
|
},
|
||||||
|
alter: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
emits: ['chooseSkill'],
|
emits: ['chooseSkill'],
|
||||||
setup(props,{ emit }) {
|
setup(props, { emit }) {
|
||||||
const skills = computed(() => props.skills)
|
const skills = computed(() => props.skills)
|
||||||
const lvInfo = useVModel(props, 'lvInfo')
|
const lvInfo = useVModel(props, 'lvInfo')
|
||||||
const bindAwake = useVModel(props, 'bindAwake')
|
const bindAwake = useVModel(props, 'bindAwake')
|
||||||
// const emit = defineEmits(['chooseSkill'])
|
// const emit = defineEmits(['chooseSkill'])
|
||||||
|
|
||||||
const getSkill = (lvStart: number, lvEnd: number, position: number) => {
|
const skillGrid = computed(() => {
|
||||||
if (position >= 0)
|
const grid = new Map<string, ISkill>()
|
||||||
return skills.value.find(
|
const occupiedRows = new Set<number>()
|
||||||
(item) =>
|
let maxColumn = defaultColumnCount - 1
|
||||||
item.line > lvStart - 5 &&
|
|
||||||
item.line <= Math.max(lvEnd - 5, 1) &&
|
skills.value.forEach((skill) => {
|
||||||
item.position == position,
|
const [column, row] = skill.cellPosition ?? []
|
||||||
)
|
if (!Number.isInteger(column) || !Number.isInteger(row) || column < 0 || row < 0) return
|
||||||
else
|
|
||||||
return skills.value.filter(
|
grid.set(`${row}:${column}`, skill)
|
||||||
(item) => item.line > lvStart - 5 && item.line <= Math.max(lvEnd - 5, 1),
|
occupiedRows.add(row)
|
||||||
)
|
maxColumn = Math.max(maxColumn, column)
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
grid,
|
||||||
|
columns: Array.from({ length: maxColumn + 1 }, (_, index) => index),
|
||||||
|
rows: Array.from(occupiedRows).sort((left, right) => left - right),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const showRowPrefix = computed(() => !altersWithoutRowPrefix.has(props.alter))
|
||||||
|
const isExtraAlter = computed(() => altersWithoutRowPrefix.has(props.alter))
|
||||||
|
|
||||||
|
const getRowPrefix = (row: number) => {
|
||||||
|
const lastRow = skillGrid.value.rows.at(-1) ?? -1
|
||||||
|
if (lastRow >= rowPrefixes.length && row >= rowPrefixes.length - 1)
|
||||||
|
return row === lastRow ? rowPrefixes.at(-1) : ''
|
||||||
|
|
||||||
|
return rowPrefixes[row]
|
||||||
}
|
}
|
||||||
|
|
||||||
const lvList = [15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100]
|
|
||||||
|
|
||||||
const columns = [...new Array(11).keys()]
|
|
||||||
|
|
||||||
const activeSkill = ref<number>(-1)
|
const activeSkill = ref<number>(-1)
|
||||||
|
|
||||||
|
const getLastPositionedSkill = (learnLv: number) =>
|
||||||
|
skills.value
|
||||||
|
.filter((skill) => skill.learnLv == learnLv && skill.type == 'active' && skill.bind)
|
||||||
|
.sort((left, right) => {
|
||||||
|
const [leftColumn = -1, leftRow = -1] = left.cellPosition ?? []
|
||||||
|
const [rightColumn = -1, rightRow = -1] = right.cellPosition ?? []
|
||||||
|
return leftRow - rightRow || leftColumn - rightColumn
|
||||||
|
})
|
||||||
|
.at(-1)
|
||||||
|
|
||||||
|
const extraAwakeSkill_2 = computed(() =>
|
||||||
|
props.alter == 'creator'
|
||||||
|
? skills.value.find((skill) => skill.learnLv == 85 && skill.name == '生命之树')
|
||||||
|
: getLastPositionedSkill(85),
|
||||||
|
)
|
||||||
|
const extraAwakeSkill_3 = computed(() => getLastPositionedSkill(100))
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
if (isExtraAlter.value && bindAwake.value != 85) bindAwake.value = 85
|
||||||
|
})
|
||||||
|
|
||||||
const chooseSkill = (skill?: ISkill, operation: string = 'add') => {
|
const chooseSkill = (skill?: ISkill, operation: string = 'add') => {
|
||||||
if (!skill) {
|
if (!skill) {
|
||||||
activeSkill.value = -1
|
activeSkill.value = -1
|
||||||
@@ -66,19 +109,25 @@ export default defineComponent({
|
|||||||
|
|
||||||
const actionSkillLv = (skill: ISkill, operation: string) => {
|
const actionSkillLv = (skill: ISkill, operation: string) => {
|
||||||
if (operation == 'add') {
|
if (operation == 'add') {
|
||||||
lvInfo.value[skill.id.toString()].lv = Math.min(lvInfo.value[skill.id.toString()]?.lv + 1, skill.maxLv)
|
lvInfo.value[skill.id.toString()].lv = Math.min(
|
||||||
|
lvInfo.value[skill.id.toString()]?.lv + 1,
|
||||||
|
skill.maxLv,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (operation == 'addMax') {
|
if (operation == 'addMax') {
|
||||||
lvInfo.value[skill.id.toString()].lv = skill.maxLearnLv
|
lvInfo.value[skill.id.toString()].lv = skill.maxLearnLv
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (operation == 'sub') {
|
if (operation == 'sub') {
|
||||||
lvInfo.value[skill.id.toString()].lv = Math.max(lvInfo.value[skill.id.toString()]?.lv - 1, 0)
|
lvInfo.value[skill.id.toString()].lv = Math.max(
|
||||||
|
lvInfo.value[skill.id.toString()]?.lv - 1,
|
||||||
|
0,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (operation == 'subMax') {
|
if (operation == 'subMax') {
|
||||||
lvInfo.value[skill.id.toString()] = { lv: 0 , vp: 0, up: 0 }
|
lvInfo.value[skill.id.toString()] = { lv: 0, vp: 0, up: 0 }
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
emit('chooseSkill', skill.id)
|
emit('chooseSkill', skill.id)
|
||||||
@@ -88,78 +137,86 @@ export default defineComponent({
|
|||||||
bindAwake.value = lv
|
bindAwake.value = lv
|
||||||
}
|
}
|
||||||
|
|
||||||
const renderSkill = (skill: ISkill, index: number) => {
|
const hasAwakeBinding = (skill: ISkill) =>
|
||||||
|
isExtraAlter.value
|
||||||
|
? skill.id == extraAwakeSkill_3.value?.id
|
||||||
|
: skill.learnLv == 100 && skill.bind
|
||||||
|
|
||||||
|
const renderExtraAwakeBinding = () => (
|
||||||
|
<div class="absolute extra-awake-85 w-117px h-54px left-0 top--3px box-border">
|
||||||
|
<div class="absolute w-36px h-48px left-78px top-3.5px flex flex-col box-border items-center py-3px z-2">
|
||||||
|
<img class="h-28px w-28px" src={getImageURL(extraAwakeSkill_2.value?.icon ?? '')}></img>
|
||||||
|
<div class="w-100% flex flex-1 justify-center text-#ffc701 pt-1.5px">2次</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
|
||||||
|
const renderSkill = (skill: ISkill) => {
|
||||||
const info = lvInfo.value?.[skill.id.toString()]
|
const info = lvInfo.value?.[skill.id.toString()]
|
||||||
let color = 'white'
|
let color = 'white'
|
||||||
if (info?.lv < skill.maxLearnLv) color = '#32E432'
|
if (info?.lv < skill.maxLearnLv) color = '#32E432'
|
||||||
if (info?.lv > skill.maxLearnLv) color = '#58E0FC'
|
if (info?.lv > skill.maxLearnLv) color = '#58E0FC'
|
||||||
return (
|
return (
|
||||||
<>
|
<div class="relative w-35px h-55px" key={skill.id}>
|
||||||
<div class="relative w-35px h-55px">
|
<div class="flex w-full items-center justify-center gap-2px absolute top--18px left-1px">
|
||||||
<div class="flex w-full items-center justify-center gap-2px absolute top--18px left-1px">
|
{info?.vp > 0 && <div class={`vp_${info.vp}`}></div>}
|
||||||
{info?.vp > 0 && (<div class={`vp_${info.vp}`}></div>)}
|
{info?.up > 0 && <div class={`up_${info.up}`}></div>}
|
||||||
{info?.up > 0 && (<div class={`up_${info.up}`}></div>)}
|
|
||||||
</div>
|
|
||||||
{activeSkill.value == skill.id && renderSkillAction(skill)}
|
|
||||||
<div
|
|
||||||
class={[
|
|
||||||
'w-36px absolute h-48px flex flex-col box-border items-center py-3px z-2',
|
|
||||||
skill.learnLv == 100 && skill.bind ? '' : 'skill',
|
|
||||||
]}
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation()
|
|
||||||
chooseSkill(skill)
|
|
||||||
}}
|
|
||||||
onContextmenu={(e) => {
|
|
||||||
e.stopPropagation()
|
|
||||||
e.preventDefault()
|
|
||||||
chooseSkill(skill, 'sub')
|
|
||||||
}}
|
|
||||||
key={index}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
class={['h-28px w-28px', skill.type === 'passive' ? 'passive' : '']}
|
|
||||||
src={getImageURL(skill.icon)}
|
|
||||||
alt={skill.name}
|
|
||||||
></img>
|
|
||||||
<div class="w-100% flex flex-1 justify-center" style={{ color }}>
|
|
||||||
{info?.lv ?? 0}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{skill.learnLv == 100 && skill.bind && (
|
|
||||||
<>
|
|
||||||
<div
|
|
||||||
class={`pos-absolute w-196px h-54px box-border translate-x--50% left-18px top--3px flex justify-between items-center py-2px px-3px awake_${bindAwake.value}`}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="w-36px flex flex-col box-border items-center py-2px z-2"
|
|
||||||
onClick={() => chooseBindAwake(50)}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
class="h-28px w-28px mt-2px"
|
|
||||||
src={getImageURL(awakeSkill_1.value?.icon ?? '')}
|
|
||||||
></img>
|
|
||||||
<div class="w-100% mt-1px flex items-center justify-center text-#ffc701">
|
|
||||||
1次
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="w-36px flex flex-col box-border items-center py-2px z-2"
|
|
||||||
onClick={() => chooseBindAwake(85)}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
class="h-28px w-28px mt-1px"
|
|
||||||
src={getImageURL(awakeSkill_2.value?.icon ?? '')}
|
|
||||||
></img>
|
|
||||||
<div class="w-100% mt-1px flex items-center justify-center text-#ffc701">
|
|
||||||
2次
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
{activeSkill.value == skill.id && renderSkillAction(skill)}
|
||||||
|
<div
|
||||||
|
class={[
|
||||||
|
'w-36px absolute h-48px flex flex-col box-border items-center py-3px z-2',
|
||||||
|
hasAwakeBinding(skill) ? '' : 'skill',
|
||||||
|
]}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
chooseSkill(skill)
|
||||||
|
}}
|
||||||
|
onContextmenu={(e) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
e.preventDefault()
|
||||||
|
chooseSkill(skill, 'sub')
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
class={['h-28px w-28px', skill.type === 'passive' ? 'passive' : '']}
|
||||||
|
src={getImageURL(skill.icon)}
|
||||||
|
alt={skill.name}
|
||||||
|
></img>
|
||||||
|
<div class="w-100% flex flex-1 justify-center pt-1.5px" style={{ color }}>
|
||||||
|
{info?.lv ?? 0}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{hasAwakeBinding(skill) &&
|
||||||
|
(isExtraAlter.value ? (
|
||||||
|
renderExtraAwakeBinding()
|
||||||
|
) : (
|
||||||
|
<div
|
||||||
|
class={`pos-absolute w-196px h-54px box-border translate-x--50% left-18px top--3px flex justify-between items-center py-2px px-3px awake_${bindAwake.value}`}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="w-36px flex flex-col box-border items-center py-2px z-2"
|
||||||
|
onClick={() => chooseBindAwake(50)}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
class="h-28px w-28px mt-2px"
|
||||||
|
src={getImageURL(awakeSkill_1.value?.icon ?? '')}
|
||||||
|
></img>
|
||||||
|
<div class="w-100% mt-1px flex items-center justify-center text-#ffc701">1次</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="w-36px flex flex-col box-border items-center py-2px z-2"
|
||||||
|
onClick={() => chooseBindAwake(85)}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
class="h-28px w-28px mt-1px"
|
||||||
|
src={getImageURL(awakeSkill_2.value?.icon ?? '')}
|
||||||
|
></img>
|
||||||
|
<div class="w-100% mt-1px flex items-center justify-center text-#ffc701">2次</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,37 +293,24 @@ export default defineComponent({
|
|||||||
return () => (
|
return () => (
|
||||||
<>
|
<>
|
||||||
<div onClick={() => (activeSkill.value = -1)}>
|
<div onClick={() => (activeSkill.value = -1)}>
|
||||||
{((getSkill(0, 15, -1) ?? []) as ISkill[]).length > 0 && (
|
{skillGrid.value.rows.map((row) => (
|
||||||
<>
|
<div class="skill-tree-line flex items-center gap-8px px-5px" key={row}>
|
||||||
<div class="skill-tree-line flex items-center gap-8px px-5px">
|
{showRowPrefix.value && (
|
||||||
<div class="w-34px h-34px flex items-center justify-center text-white">
|
<div class="w-34px h-34px flex shrink-0 items-center justify-center text-white">
|
||||||
其<br />余
|
{getRowPrefix(row)}
|
||||||
</div>
|
</div>
|
||||||
{((getSkill(0, 15, -1) ?? []) as ISkill[])?.map((skill, index) =>
|
)}
|
||||||
renderSkill(skill, index),
|
{skillGrid.value.columns.map((column) => {
|
||||||
)}
|
const skill = skillGrid.value.grid.get(`${row}:${column}`)
|
||||||
</div>
|
return skill ? (
|
||||||
</>
|
renderSkill(skill)
|
||||||
)}
|
|
||||||
|
|
||||||
{lvList.map((lv, index) =>
|
|
||||||
((getSkill(lv, lvList[index + 1] ?? 150, -1) as ISkill[])?.length ?? 0) > 0 ? (
|
|
||||||
<div class="skill-tree-line flex items-center gap-8px px-5px" key={index}>
|
|
||||||
{lv == 1 || lv % 10 == 0 ? (
|
|
||||||
<div class="w-34px h-34px flex items-center justify-center text-white">{lv}</div>
|
|
||||||
) : (
|
) : (
|
||||||
<div class="w-34px h-34px"></div>
|
<div class="w-34px h-34px shrink-0" key={column}></div>
|
||||||
)}
|
)
|
||||||
{columns.map((column, i) => {
|
})}
|
||||||
const skill = getSkill(lv, lvList[index + 1] ?? 150, column) as ISkill
|
<div class="w-5px h-34px shrink-0" onClick={() => (activeSkill.value = -1)}></div>
|
||||||
return skill ? renderSkill(skill, index) : <div class="w-34px h-34px"></div>
|
</div>
|
||||||
})}
|
))}
|
||||||
<div class="w-5px h-34px" onClick={() => (activeSkill.value = -1)}></div>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<></>
|
|
||||||
),
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -34,6 +34,11 @@
|
|||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.extra-awake-85 {
|
||||||
|
background-image: url('./img/extra_awake_85.png');
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.vp_1{
|
.vp_1{
|
||||||
width: 18px;
|
width: 18px;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
<div class="overflow-y-auto h-full box-border" v-if="tab === 0">
|
<div class="overflow-y-auto h-full box-border" v-if="tab === 0">
|
||||||
<SkillTree
|
<SkillTree
|
||||||
:skills="infoStore.skills"
|
:skills="infoStore.skills"
|
||||||
|
:alter="infoStore.infos?.alter"
|
||||||
v-model:lvInfo="configStore.config.skills"
|
v-model:lvInfo="configStore.config.skills"
|
||||||
v-model:bindAwake="configStore.config.bindAwake"
|
v-model:bindAwake="configStore.config.bindAwake"
|
||||||
@chooseSkill="setCurrentSkill"
|
@chooseSkill="setCurrentSkill"
|
||||||
|
|||||||
Reference in New Issue
Block a user