feat: 完成英雄配置编辑器全流程功能开发
本次提交实现了完整的英雄配置管理系统: 1. 新增服务器端英雄数据持久化接口,支持读取和保存英雄配置 2. 重构前端英雄编辑器UI,替换侧边栏为下拉选择器适配移动端 3. 统一调整前端页面样式,压缩间距适配更多内容 4. 修复Tooltip组件显示逻辑,优化技能飘字效果 5. 导入CSV英雄配置数据,补全全职业技能配置 6. 调整多个英雄预制体的尺寸和位置参数 7. 生成完整的英雄配置导出文件hexport.ts
This commit is contained in:
770
put/server/data/heroes.json
Normal file
770
put/server/data/heroes.json
Normal file
@@ -0,0 +1,770 @@
|
||||
{
|
||||
"heroes": [
|
||||
{
|
||||
"uuid": 5001,
|
||||
"name": "叠甲骑士",
|
||||
"comment": "CSV导入:自身护盾+全体护盾",
|
||||
"path": "hk1",
|
||||
"rarity": 1,
|
||||
"roleKey": "Tank",
|
||||
"growKey": "Tank",
|
||||
"typeKey": "Melee",
|
||||
"statBase": {
|
||||
"hp": 20,
|
||||
"ap": 0,
|
||||
"def": 10
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6004,
|
||||
"name": "",
|
||||
"cd": 1.2,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "挥剑对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 120
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6301,
|
||||
"name": "魔法盾",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 30,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "{target}获得生命最大值{ap}%的护盾",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 60,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 120,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {},
|
||||
"atked": {
|
||||
"6301": [
|
||||
{
|
||||
"lv": 4,
|
||||
"s_lv": 1,
|
||||
"name": "全体圣盾",
|
||||
"t_num": 3,
|
||||
"overrides": {
|
||||
"TGroup": null,
|
||||
"ap": 10,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "全队获得本英雄生命最大值{ap}%的护盾"
|
||||
}
|
||||
]
|
||||
},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5002,
|
||||
"name": "易伤剑仙",
|
||||
"comment": "CSV导入:击退压场+易伤放大;复刻酒仙",
|
||||
"path": "hk3",
|
||||
"rarity": 1,
|
||||
"roleKey": "Warrior",
|
||||
"growKey": "Warrior",
|
||||
"typeKey": "Melee",
|
||||
"statBase": {
|
||||
"hp": 5,
|
||||
"ap": 20,
|
||||
"def": 5
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6004,
|
||||
"name": "",
|
||||
"cd": 1.2,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "挥拳对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 120
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6101,
|
||||
"name": "气斩",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 150,
|
||||
"timed_buff_id": 7002,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"buff_value": 20,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 180,
|
||||
"bck": 60,
|
||||
"buff_value": 40,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {
|
||||
"6004": [
|
||||
{
|
||||
"lv": 4,
|
||||
"s_lv": 1,
|
||||
"name": "奋力一击",
|
||||
"t_num": 3,
|
||||
"overrides": {
|
||||
"ap": 300
|
||||
},
|
||||
"desc": "每三次攻击后立即打击{target},造成攻击力{ap}%伤害"
|
||||
}
|
||||
]
|
||||
},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5003,
|
||||
"name": "眩晕暴击哥",
|
||||
"comment": "CSV导入:高爆发+击晕收割;复刻齐天大圣",
|
||||
"path": "hk5",
|
||||
"rarity": 1,
|
||||
"roleKey": "Warrior",
|
||||
"growKey": "Warrior",
|
||||
"typeKey": "Melee",
|
||||
"statBase": {
|
||||
"hp": 5,
|
||||
"ap": 20,
|
||||
"def": 5
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6004,
|
||||
"name": "",
|
||||
"cd": 1.2,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "挥斧对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"stun": 10
|
||||
},
|
||||
"desc": "挥斧对{target}造成攻击力{ap}%伤害,{stun}%概率击晕"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6104,
|
||||
"name": "开山斧",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 300,
|
||||
"stun": 100,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 450,
|
||||
"stun": 100,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 450,
|
||||
"stun": 100,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [
|
||||
{
|
||||
"lv": 4,
|
||||
"uuids": [
|
||||
{
|
||||
"uuid": 7005,
|
||||
"value": 0.25,
|
||||
"name": "大圣神威"
|
||||
}
|
||||
],
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5004,
|
||||
"name": "刀刀暴击",
|
||||
"comment": "CSV导入:暴击/暴伤双光环乘区;复刻剑圣",
|
||||
"path": "hc1",
|
||||
"rarity": 1,
|
||||
"roleKey": "Assassin",
|
||||
"growKey": "Assassin",
|
||||
"typeKey": "Mid",
|
||||
"statBase": {
|
||||
"hp": 0,
|
||||
"ap": 30,
|
||||
"def": 0
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6002,
|
||||
"name": "",
|
||||
"cd": 0.9,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Fast].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "挥刀对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"crt": 10
|
||||
},
|
||||
"desc": "挥刀对{target}造成攻击力{ap}%伤害,{crt}%概率暴击"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6100,
|
||||
"name": "光闪",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 150,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "斩出光闪,对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 250,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 350,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [
|
||||
{
|
||||
"lv": 4,
|
||||
"uuids": [
|
||||
{
|
||||
"uuid": 7004,
|
||||
"value": 0.12,
|
||||
"name": "剑刃风暴"
|
||||
},
|
||||
{
|
||||
"uuid": 7005,
|
||||
"value": 0.2,
|
||||
"name": "斩魂利刃"
|
||||
}
|
||||
],
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5005,
|
||||
"name": "出血贼",
|
||||
"comment": "CSV导入:入场先手+受击格挡;复刻剑豪",
|
||||
"path": "hc2",
|
||||
"rarity": 1,
|
||||
"roleKey": "Assassin",
|
||||
"growKey": "Assassin",
|
||||
"typeKey": "Mid",
|
||||
"statBase": {
|
||||
"hp": 0,
|
||||
"ap": 30,
|
||||
"def": 0
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6002,
|
||||
"name": "",
|
||||
"cd": 0.9,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Fast].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "挥刀对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"timed_buff_id": 7007,
|
||||
"buff_value": 30,
|
||||
"buff_chance": 30
|
||||
},
|
||||
"desc": "挥刀对{target}造成攻击力{ap}%伤害,{buff_chance}%概率使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6103,
|
||||
"name": "闪电斩",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 150,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "召唤落雷斩击{target},造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 250,
|
||||
"timed_buff_id": 7007,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "召唤落雷斩击{target},造成攻击力{ap}%伤害,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)"
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 350,
|
||||
"para": 50,
|
||||
"timed_buff_id": 7007,
|
||||
"buff_value": 60,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [
|
||||
{
|
||||
"lv": 4,
|
||||
"uuids": [
|
||||
{
|
||||
"uuid": 7018,
|
||||
"value": 1,
|
||||
"name": "连击光环"
|
||||
}
|
||||
],
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5006,
|
||||
"name": "冻箭哥",
|
||||
"comment": "CSV导入:多重单体箭,带冰冻",
|
||||
"path": "ha1",
|
||||
"rarity": 1,
|
||||
"roleKey": "Archer",
|
||||
"growKey": "Archer",
|
||||
"typeKey": "Long",
|
||||
"statBase": {
|
||||
"hp": 0,
|
||||
"ap": 30,
|
||||
"def": 0
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6006,
|
||||
"name": "",
|
||||
"cd": 1.05,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Normal].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "射出箭矢,对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"bck": 10
|
||||
},
|
||||
"desc": "射出箭矢,对{target}造成攻击力{ap}%伤害,击退{bck}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6150,
|
||||
"name": "万箭齐发·冰",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 150,
|
||||
"frz": 30,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 200,
|
||||
"frz": 50,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 250,
|
||||
"frz": 70,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [
|
||||
{
|
||||
"lv": 4,
|
||||
"uuids": [
|
||||
{
|
||||
"uuid": 7006,
|
||||
"value": 0.15,
|
||||
"name": ""
|
||||
}
|
||||
],
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5007,
|
||||
"name": "击退火女",
|
||||
"comment": "CSV导入:群体击退/麻痹压场;复刻深渊女王",
|
||||
"path": "hm1",
|
||||
"rarity": 1,
|
||||
"roleKey": "Mage",
|
||||
"growKey": "Mage",
|
||||
"typeKey": "Long",
|
||||
"statBase": {
|
||||
"hp": -5,
|
||||
"ap": 10,
|
||||
"def": 0
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6010,
|
||||
"name": "",
|
||||
"cd": 1.2,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Slow].cd",
|
||||
"overrides": {
|
||||
"ap": 100,
|
||||
"bck": 30
|
||||
},
|
||||
"desc": "掷出紫魔球,对{target}造成攻击力{ap}%伤害,击退{bck}",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"bck": 40
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6200,
|
||||
"name": "火焰喷射",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 250,
|
||||
"bck": 100,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 350,
|
||||
"bck": 100,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 450,
|
||||
"bck": 100,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [
|
||||
{
|
||||
"lv": 4,
|
||||
"uuids": [
|
||||
{
|
||||
"uuid": 7002,
|
||||
"value": 0.15,
|
||||
"name": "深渊威压"
|
||||
}
|
||||
],
|
||||
"desc": ""
|
||||
}
|
||||
],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
},
|
||||
{
|
||||
"uuid": 5008,
|
||||
"name": "团疗奶爸",
|
||||
"comment": "CSV导入:全体治疗续航+自身护盾",
|
||||
"path": "hh1",
|
||||
"rarity": 1,
|
||||
"roleKey": "Support",
|
||||
"growKey": "Support",
|
||||
"typeKey": "Long",
|
||||
"statBase": {
|
||||
"hp": 10,
|
||||
"ap": 20,
|
||||
"def": 0
|
||||
},
|
||||
"dis": null,
|
||||
"speed": null,
|
||||
"skills": [
|
||||
{
|
||||
"uuid": 6011,
|
||||
"name": "",
|
||||
"cd": 1.05,
|
||||
"cdExpr": "AtkSpeedSet[AtkSpeedLv.Normal].cd",
|
||||
"overrides": {
|
||||
"ap": 100
|
||||
},
|
||||
"desc": "挥杖对{target}造成攻击力{ap}%伤害",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 2,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"bck": 10
|
||||
},
|
||||
"desc": "挥杖对{target}造成攻击力{ap}%伤害,击退{bck}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": 6302,
|
||||
"name": "治疗",
|
||||
"cd": 8,
|
||||
"cdExpr": null,
|
||||
"overrides": {
|
||||
"ap": 300,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "为{target}回复攻击力{ap}%生命",
|
||||
"lv_entries": [
|
||||
{
|
||||
"lv": 8,
|
||||
"s_lv": 2,
|
||||
"overrides": {
|
||||
"ap": 400,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": ""
|
||||
},
|
||||
{
|
||||
"lv": 16,
|
||||
"s_lv": 3,
|
||||
"overrides": {
|
||||
"ap": 450,
|
||||
"summon_count": 2
|
||||
},
|
||||
"desc": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"atking": {
|
||||
"6301": [
|
||||
{
|
||||
"lv": 4,
|
||||
"s_lv": 1,
|
||||
"name": "圣愈之盾",
|
||||
"t_num": 3,
|
||||
"overrides": {
|
||||
"ap": 30,
|
||||
"summon_count": 1
|
||||
},
|
||||
"desc": "{target}获得生命最大值{ap}%的护盾"
|
||||
}
|
||||
]
|
||||
},
|
||||
"atked": {},
|
||||
"fstart": {},
|
||||
"dead": {},
|
||||
"field": [],
|
||||
"revive": [],
|
||||
"ap_bonus": [],
|
||||
"hp_bonus": [],
|
||||
"def_bonus": [],
|
||||
"info": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -9,6 +9,8 @@ const __dirname = path.dirname(url.fileURLToPath(import.meta.url))
|
||||
const PROJECT_ROOT = path.resolve(__dirname, '..', '..')
|
||||
const CONFIG_DIR = path.join(PROJECT_ROOT, 'assets/script/game/common/config')
|
||||
const EXPORT_PATH = path.join(CONFIG_DIR, 'hexport.ts')
|
||||
const DATA_DIR = path.join(__dirname, 'data')
|
||||
const HEROES_PATH = path.join(DATA_DIR, 'heroes.json')
|
||||
|
||||
const app = express()
|
||||
app.use(cors())
|
||||
@@ -73,6 +75,36 @@ app.post('/api/refresh', async (_req, res) => {
|
||||
}
|
||||
})
|
||||
|
||||
/** 英雄数据持久化:GET 读取(无文件时返回空列表) */
|
||||
app.get('/api/heroes', (_req, res) => {
|
||||
try {
|
||||
if (!fs.existsSync(HEROES_PATH)) return res.json({ heroes: [] })
|
||||
res.json(JSON.parse(fs.readFileSync(HEROES_PATH, 'utf8')))
|
||||
} catch (e) {
|
||||
res.status(500).json({ error: String(e?.message || e) })
|
||||
}
|
||||
})
|
||||
|
||||
/** 英雄数据持久化:POST 全量覆盖保存 */
|
||||
app.post('/api/heroes', (req, res) => {
|
||||
const heroes = req.body?.heroes
|
||||
if (!Array.isArray(heroes)) {
|
||||
return res.status(400).json({ error: 'heroes 必须为数组' })
|
||||
}
|
||||
try {
|
||||
fs.mkdirSync(DATA_DIR, { recursive: true })
|
||||
fs.writeFileSync(HEROES_PATH, JSON.stringify({ heroes }, null, 2), 'utf8')
|
||||
res.json({ ok: true, path: HEROES_PATH, count: heroes.length })
|
||||
} catch (e) {
|
||||
res.status(500).json({ error: String(e?.message || e) })
|
||||
}
|
||||
})
|
||||
|
||||
/** 序列化 overrides:TGroup 以字符串存储(如 "Team"),导出时还原为枚举表达式 TGroup.Team */
|
||||
function serializeOverrides(o) {
|
||||
return JSON.stringify(o).replace(/"TGroup":\s*"(\w+)"/g, '"TGroup": TGroup.$1')
|
||||
}
|
||||
|
||||
/** 生成 hexport.ts 内容 */
|
||||
function renderHeroTs(heroes) {
|
||||
const nl = '\n'
|
||||
@@ -84,6 +116,7 @@ function renderHeroTs(heroes) {
|
||||
out += ` */${nl}`
|
||||
out += `import { v3 } from "cc"${nl}`
|
||||
out += `import { FacSet } from "./GameSet"${nl}`
|
||||
out += `import { TGroup } from "./SkillSet"${nl}`
|
||||
out += `import { SkillLv, HType, HGrowType, HRole, HERO_ROLE_BASE, AtkSpeedSet, AtkSpeedLv, heroInfo } from "./heroSet"${nl}`
|
||||
out += nl
|
||||
out += `export const HexportHeroInfo: Record<number, heroInfo> = {${nl}`
|
||||
@@ -120,7 +153,7 @@ function renderSingleHero(h) {
|
||||
parts.push(`lv: 1`)
|
||||
parts.push(`cd: ${sk.cdExpr || sk.cd}`)
|
||||
parts.push(`ccd: 0`)
|
||||
if (sk.overrides && Object.keys(sk.overrides).length) parts.push(`overrides: ${JSON.stringify(sk.overrides)}`)
|
||||
if (sk.overrides && Object.keys(sk.overrides).length) parts.push(`overrides: ${serializeOverrides(sk.overrides)}`)
|
||||
if (sk.desc) parts.push(`desc: ${JSON.stringify(sk.desc)}`)
|
||||
if (sk.lv_entries?.length) {
|
||||
push(` ${sk.uuid}: { ${parts.join(', ')},`)
|
||||
@@ -128,7 +161,7 @@ function renderSingleHero(h) {
|
||||
for (const e of sk.lv_entries) {
|
||||
const eparts = [`lv: ${e.lv}`]
|
||||
if (e.s_lv) eparts.push(`s_lv: SkillLv.Lv${e.s_lv}`)
|
||||
if (e.overrides && Object.keys(e.overrides).length) eparts.push(`overrides: ${JSON.stringify(e.overrides)}`)
|
||||
if (e.overrides && Object.keys(e.overrides).length) eparts.push(`overrides: ${serializeOverrides(e.overrides)}`)
|
||||
if (e.desc) eparts.push(`desc: ${JSON.stringify(e.desc)}`)
|
||||
push(` { ${eparts.join(', ')} },`)
|
||||
}
|
||||
@@ -153,7 +186,7 @@ function renderSingleHero(h) {
|
||||
if (e.s_lv) eparts.push(`s_lv: SkillLv.Lv${e.s_lv}`)
|
||||
if (e.name) eparts.push(`name: ${JSON.stringify(e.name)}`)
|
||||
eparts.push(`t_num: ${e.t_num}`)
|
||||
if (e.overrides && Object.keys(e.overrides).length) eparts.push(`overrides: ${JSON.stringify(e.overrides)}`)
|
||||
if (e.overrides && Object.keys(e.overrides).length) eparts.push(`overrides: ${serializeOverrides(e.overrides)}`)
|
||||
if (e.desc) eparts.push(`desc: ${JSON.stringify(e.desc)}`)
|
||||
push(` { ${eparts.join(', ')} },`)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user