16 Commits

Author SHA1 Message Date
panFD
50f43c227a refactor(mission): 优化战斗关卡UI显示与逻辑
1.  调整MissionComp注释与战斗计时获取逻辑
2.  移除关卡波数显示中的总波数限制,只显示当前波数
3.  更新mission.prefab的UI布局与默认显示文本
4.  调整地图prefab的物体位置
5.  修改bg2动画的帧率与时长参数
2026-06-13 22:42:09 +08:00
panFD
9c2c0a1621 feat(map): add hero move animation component
新增了英雄移动组件,实现多个英雄的周期性往复移动和动画速度同步匹配
同时更新了预制件配置以适配新的组件和节点命名调整
2026-06-13 22:12:27 +08:00
panFD
b12270be66 fix(map): 强制开启信息弹窗的关闭按钮
移除技能卡预览模式下关闭按钮的条件显示逻辑,始终显示关闭节点
2026-06-13 17:57:10 +08:00
panFD
d926c08582 feat(ui): 为所有按钮添加全局点击音效
1. 重构按钮点击音效添加方式,通过重写Button原型的_onTouchEnded方法实现全局注入
2. 移除各业务组件中手动添加的按钮音效播放代码,统一音效播放逻辑
2026-06-13 16:56:41 +08:00
panFD
10ab03b871 feat(audio): add new audio assets and replace old wav files
1. add new mp3 format audio files and their meta configuration files
2. delete old unused wav format audio files and their meta files
3. add flash effect audio playback logic in skill casting system
2026-06-13 16:35:56 +08:00
panFD
7dd5257fd8 修复(地图任务组件): 调整战斗和主页场景的背景音乐音量
为战斗场景设置背景音乐音量为0.5,为主页场景恢复默认音量1.0,同时更新对应注释说明。
2026-06-13 11:23:30 +08:00
panFD
b0d752ab18 feat(游戏): 新增背景音乐资源,添加播放逻辑并优化教程UI
新增主页与战斗场景的背景音乐文件及对应的导入配置
在主页和战斗任务组件中添加循环播放背景音乐的逻辑
调整四个新手教程引导预制体的文字、字体、描边与布局参数
2026-06-13 11:23:00 +08:00
panFD
4460c1aaf2 feat(音频): 添加音频资源、音效开关与战斗音效播放逻辑
- 新增Hit、Critical、Attack_01/02、dun等音频资源及元文件
- 新增音效与背景音乐开关配置,包含状态同步与更新方法
- 在英雄受击时根据暴击状态播放对应音效
2026-06-13 09:37:23 +08:00
panFD
092d0e4371 feat(hero&skill): 新增击晕控制相关技能与属性支持
1. 新增击晕率属性计算与驻场加成逻辑
2. 重构冰冻相关英雄为击晕控制英雄
3. 完善技能描述显示与配置参数
4. 更新UI预制体 sprite 配置(仅为资源变更)
2026-06-12 22:12:35 +08:00
panFD
8fca560efd chore(skill assets): clean up unused skill related prefab and animation files
本次提交清理了大量未使用的技能相关预制件和动画资源文件,包括多个失效的prefab、anim及其meta元文件,同时优化了dead.prefab和yellow.anim的配置参数,移除冗余无用的资源代码。
2026-06-12 22:00:28 +08:00
panFD
44ce6cd30c feat: 添加击晕状态相关功能
1. 新增击晕概率、抗性属性配置与组件字段
2. 实现击晕判定逻辑与视图特效播放
3. 增加击晕时技能CD暂停清零的处理
4. 配置默认击晕持续时间为2秒
2026-06-12 21:34:39 +08:00
panFD
3ea1a4d44c feat(skill/buff): 新增眩晕buff相关资源与预制体
新增了眩晕buff的动画剪辑、动画元数据、眩晕buff预制体以及对应的预制体元数据文件,同时更新了技能图标资源。
2026-06-12 21:28:54 +08:00
panFD
82adaf4069 refactor(hero-config): 调整击退推拉流为穿刺风怒流配置
1. 重命名英雄分类注释和对应英雄描述文本,将击退相关效果替换为穿透、风怒效果
2. 更新英雄绑定的技能ID,移除击退相关的属性配置
3. 同步修改技能注释和描述文本,移除击退相关描述
4. 标记废弃的强化技能为暂未使用
2026-06-12 20:37:13 +08:00
panFD
7aa8a47a65 refactor(hero): 统一角色状态初始化逻辑并调整UI布局
1. 将HeroSpine和HeroViewComp的默认状态从"idle"改为空字符串
2. 替换HeroViewComp中直接调用as.idle()为status_change方法
3. 调整role_controller预制体的UI元素位置和尺寸,适配240宽度布局
2026-06-12 20:28:33 +08:00
pan
488b1632ef feat(测试模式): 新增怪物技能测试覆盖功能并完善测试配置
修复怪物生成位置索引越界问题,通过对位置数组长度取模限制合法索引范围
新增测试模式专属的怪物技能覆盖逻辑,支持覆盖普攻及各类触发技能配置
扩展测试模式配置项,新增怪物生成数量、词缀配置以及全类型技能覆盖参数
优化 Rogue 关卡生成引擎,支持批量生成测试怪物并计算词缀属性加成
2026-06-12 16:31:32 +08:00
pan
85ab6b0507 feat(map/rogue): 新增单挑测试模式并优化Rogue阶梯配置
重新基于1v1英雄战力基准推演,更新各Tier的难度乘数和预算参数
新增TestModeConfig配置项,支持自定义测试怪物的基础属性、类型和增长比例
在怪物生成逻辑中加入测试模式分支,开启后每波仅生成1只匹配配置的怪物
在MissionMonComp组件中添加测试模式开启的日志提示
2026-06-12 16:15:04 +08:00
66 changed files with 3312 additions and 4744 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,165 +0,0 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "dead",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 45,
"speed": 1,
"wrapMode": 1,
"enableTrsBlending": false,
"_duration": 0.37777777777777777,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Node"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.022222222222222223,
0.044444444444444446,
0.06666666666666667,
0.08888888888888889,
0.1111111111111111,
0.13333333333333333,
0.15555555555555556,
0.17777777777777778,
0.2,
0.2222222222222222,
0.24444444444444444,
0.26666666666666666,
0.28888888888888886,
0.3111111111111111,
0.3333333333333333,
0.35555555555555557
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c0540",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@2c693",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@dd835",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3dbff",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bc740",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1be63",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@785a5",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@ab085",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@df057",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@07942",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3d5cc",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1e82b",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@b780c",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bb712",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@8dd96",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@53ccb",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bef27",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -1,167 +0,0 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "start",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 45,
"speed": 1,
"wrapMode": 1,
"enableTrsBlending": false,
"_duration": 0.4,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Fx08_00"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.022222222222222223,
0.044444444444444446,
0.06666666666666667,
0.08888888888888889,
0.1111111111111111,
0.13333333333333333,
0.15555555555555556,
0.17777777777777778,
0.2,
0.2222222222222222,
0.24444444444444444,
0.26666666666666666,
0.28888888888888886,
0.3111111111111111,
0.3333333333333333,
0.35555555555555557,
0.37777777777777777
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c0540",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@2c693",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@dd835",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3dbff",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bc740",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1be63",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@785a5",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@ab085",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@df057",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@07942",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3d5cc",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1e82b",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@b780c",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bb712",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@8dd96",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@53ccb",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bef27",
"__expectedType__": "cc.SpriteFrame"
},
null
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -1,13 +0,0 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "9b809af9-120e-4683-a90a-5fecbd4e1ebd",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "start"
}
}

View File

@@ -1,13 +0,0 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "67419693-8fea-48df-a2f4-d52e993932c0",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "buff_wind"
}
}

View File

@@ -1,17 +1,17 @@
[ [
{ {
"__type__": "cc.AnimationClip", "__type__": "cc.AnimationClip",
"_name": "buff_wind", "_name": "stun",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": { "__editorExtras__": {
"embeddedPlayerGroups": [] "embeddedPlayerGroups": []
}, },
"_native": "", "_native": "",
"sample": 18, "sample": 20,
"speed": 1, "speed": 1,
"wrapMode": 1, "wrapMode": 2,
"enableTrsBlending": false, "enableTrsBlending": false,
"_duration": 0.5555555555555556, "_duration": 0.45,
"_hash": 500763545, "_hash": 500763545,
"_tracks": [ "_tracks": [
{ {
@@ -69,55 +69,50 @@
"__type__": "cc.ObjectCurve", "__type__": "cc.ObjectCurve",
"_times": [ "_times": [
0, 0,
0.05555555555555555, 0.05,
0.1111111111111111, 0.1,
0.16666666666666666, 0.15,
0.2222222222222222, 0.2,
0.2777777777777778, 0.25,
0.3333333333333333, 0.3,
0.3888888888888889, 0.35,
0.4444444444444444, 0.4
0.5
], ],
"_values": [ "_values": [
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@121c9", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1069b",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@32458", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@5e490",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@770ee", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@33f1e",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bad49", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@71255",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c9790", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@4a25e",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@121c9", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@9eaf3",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@32458", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3f6a9",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@770ee", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bf2fe",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
{ {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bad49", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@eab68",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c9790",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
} }
] ]

View File

@@ -2,12 +2,12 @@
"ver": "2.0.3", "ver": "2.0.3",
"importer": "animation-clip", "importer": "animation-clip",
"imported": true, "imported": true,
"uuid": "f6fa875d-2465-4e3b-8f4d-52d2ee43481d", "uuid": "f069198d-2c19-4ebc-bd5f-66a3138b914f",
"files": [ "files": [
".cconb" ".cconb"
], ],
"subMetas": {}, "subMetas": {},
"userData": { "userData": {
"name": "dead" "name": "stun"
} }
} }

View File

@@ -7,11 +7,11 @@
"embeddedPlayerGroups": [] "embeddedPlayerGroups": []
}, },
"_native": "", "_native": "",
"sample": 12, "sample": 30,
"speed": 1, "speed": 1,
"wrapMode": 1, "wrapMode": 1,
"enableTrsBlending": false, "enableTrsBlending": false,
"_duration": 0.4166666666666667, "_duration": 0.16666666666666666,
"_hash": 500763545, "_hash": 500763545,
"_tracks": [ "_tracks": [
{ {
@@ -69,10 +69,10 @@
"__type__": "cc.ObjectCurve", "__type__": "cc.ObjectCurve",
"_times": [ "_times": [
0, 0,
0.08333333333333333, 0.03333333333333333,
0.16666666666666666, 0.06666666666666667,
0.25, 0.1,
0.3333333333333333 0.13333333333333333
], ],
"_values": [ "_values": [
{ {

View File

@@ -1,13 +0,0 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "311c4048-f871-4f0d-a1e6-c1d82aba4a42",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "buff_wind"
}
}

View File

@@ -1,7 +1,7 @@
[ [
{ {
"__type__": "cc.Prefab", "__type__": "cc.Prefab",
"_name": "buff_wind", "_name": "stun",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_native": "", "_native": "",
@@ -13,7 +13,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "buff_wind", "_name": "stun",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": null, "_parent": null,
@@ -87,7 +87,7 @@
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0, "x": 0,
"y": 0, "y": 85,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -100,7 +100,7 @@
"_lscale": { "_lscale": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 1, "x": 1,
"y": 1.5, "y": 0.8,
"z": 1 "z": 1
}, },
"_mobility": 0, "_mobility": 0,
@@ -127,8 +127,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 145, "width": 113,
"height": 105 "height": 50
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -164,7 +164,7 @@
"a": 206 "a": 206
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@121c9", "__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1069b",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 1, "_type": 1,
@@ -245,12 +245,12 @@
"playOnLoad": true, "playOnLoad": true,
"_clips": [ "_clips": [
{ {
"__uuid__": "67419693-8fea-48df-a2f4-d52e993932c0", "__uuid__": "f069198d-2c19-4ebc-bd5f-66a3138b914f",
"__expectedType__": "cc.AnimationClip" "__expectedType__": "cc.AnimationClip"
} }
], ],
"_defaultClip": { "_defaultClip": {
"__uuid__": "67419693-8fea-48df-a2f4-d52e993932c0", "__uuid__": "f069198d-2c19-4ebc-bd5f-66a3138b914f",
"__expectedType__": "cc.AnimationClip" "__expectedType__": "cc.AnimationClip"
}, },
"_id": "" "_id": ""

View File

@@ -2,12 +2,12 @@
"ver": "1.1.50", "ver": "1.1.50",
"importer": "prefab", "importer": "prefab",
"imported": true, "imported": true,
"uuid": "91d53413-e69c-48fd-8553-d01cbc341f4a", "uuid": "c0e8071a-4bba-45fe-b712-751274ce67d8",
"files": [ "files": [
".json" ".json"
], ],
"subMetas": {}, "subMetas": {},
"userData": { "userData": {
"syncNodeName": "start" "syncNodeName": "stun"
} }
} }

View File

@@ -29,18 +29,15 @@
}, },
{ {
"__id__": 10 "__id__": 10
},
{
"__id__": 12
} }
], ],
"_prefab": { "_prefab": {
"__id__": 14 "__id__": 12
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 6.112, "x": 0,
"y": 45.573, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -68,7 +65,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "Node", "_name": "skill",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -90,7 +87,7 @@
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0, "x": 0,
"y": 30, "y": -60,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -102,8 +99,8 @@
}, },
"_lscale": { "_lscale": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0.65, "x": 1,
"y": 0.65, "y": 1,
"z": 1 "z": 1
}, },
"_mobility": 0, "_mobility": 0,
@@ -130,19 +127,19 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 127, "width": 228,
"height": 127 "height": 207
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
"x": 0.5, "x": 0.5,
"y": 0.5 "y": 0
}, },
"_id": "" "_id": ""
}, },
{ {
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "ddhDbko4FLmKZGY46brX7z" "fileId": "b4sNQPJWFKha7x75SWXmRj"
}, },
{ {
"__type__": "cc.Sprite", "__type__": "cc.Sprite",
@@ -166,25 +163,31 @@
"b": 255, "b": 255,
"a": 255 "a": 255
}, },
"_spriteFrame": null, "_spriteFrame": {
"_type": 0, "__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@a16b8",
"_fillType": 0, "__expectedType__": "cc.SpriteFrame"
},
"_type": 1,
"_fillType": 1,
"_sizeMode": 1, "_sizeMode": 1,
"_fillCenter": { "_fillCenter": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
"x": 0, "x": 0,
"y": 0 "y": 0
}, },
"_fillStart": 0, "_fillStart": 0.2,
"_fillRange": 0, "_fillRange": 1,
"_isTrimmedMode": true, "_isTrimmedMode": true,
"_useGrayscale": false, "_useGrayscale": true,
"_atlas": null, "_atlas": {
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": "" "_id": ""
}, },
{ {
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "c3vPZUzCRINL3sICnCZKIr" "fileId": "9a+65VIghBm4HQxuHPQ/mg"
}, },
{ {
"__type__": "cc.PrefabInfo", "__type__": "cc.PrefabInfo",
@@ -194,7 +197,7 @@
"asset": { "asset": {
"__id__": 0 "__id__": 0
}, },
"fileId": "feOW1uSctLKYCw3esMiuox", "fileId": "7a5LvbdlxEc6FKa7cun2oB",
"instance": null, "instance": null,
"targetOverrides": null, "targetOverrides": null,
"nestedPrefabInstanceRoots": null "nestedPrefabInstanceRoots": null
@@ -213,19 +216,19 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 104, "width": 80,
"height": 75 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
"x": 0.5, "x": 0.5,
"y": 0.5 "y": 0
}, },
"_id": "" "_id": ""
}, },
{ {
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "a7pn5tzA1BSI1AfdpVsHh7" "fileId": "63NP9yq3hEUKD/OZZZ5t7x"
}, },
{ {
"__type__": "cc.Animation", "__type__": "cc.Animation",
@@ -242,37 +245,19 @@
"playOnLoad": true, "playOnLoad": true,
"_clips": [ "_clips": [
{ {
"__uuid__": "f6fa875d-2465-4e3b-8f4d-52d2ee43481d", "__uuid__": "11f930a0-c09e-48e3-9616-c209909363a2",
"__expectedType__": "cc.AnimationClip" "__expectedType__": "cc.AnimationClip"
} }
], ],
"_defaultClip": { "_defaultClip": {
"__uuid__": "f6fa875d-2465-4e3b-8f4d-52d2ee43481d", "__uuid__": "11f930a0-c09e-48e3-9616-c209909363a2",
"__expectedType__": "cc.AnimationClip" "__expectedType__": "cc.AnimationClip"
}, },
"_id": "" "_id": ""
}, },
{ {
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "63z5ZyjTNKYbn+kEVB1s3W" "fileId": "c6LOemuvJKyYCqlF/yUJcr"
},
{
"__type__": "0f3c4JhFbFO2rEFqBJJ7hFv",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "32SLcINL1JHZ+vIyextzaC"
}, },
{ {
"__type__": "cc.PrefabInfo", "__type__": "cc.PrefabInfo",
@@ -282,7 +267,7 @@
"asset": { "asset": {
"__id__": 0 "__id__": 0
}, },
"fileId": "cfqCWnxbFLNoQMedQXsav3", "fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null, "instance": null,
"targetOverrides": null "targetOverrides": null
} }

View File

@@ -1,13 +1 @@
{ {"ver":"1.1.50","importer":"prefab","imported":true,"uuid":"af18002a-9f2d-4b2a-8b39-e9a1bc61563a","files":[".json"],"subMetas":{},"userData":{"syncNodeName":"dead"}}
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "97881732-3eb6-4ca6-b533-69b1df110ef3",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "dead"
}
}

View File

@@ -1,292 +0,0 @@
[
{
"__type__": "cc.Prefab",
"_name": "start",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "start",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
},
{
"__id__": 12
}
],
"_prefab": {
"__id__": 14
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 1,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Fx08_00",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 1
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 3
},
{
"__id__": 5
}
],
"_prefab": {
"__id__": 7
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 1,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 4
},
"_contentSize": {
"__type__": "cc.Size",
"width": 147,
"height": 134
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "41vle8WZtI3rAo26nuTqet"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 6
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c0540",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 1,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_fillStart": 0,
"_fillRange": 0,
"_isTrimmedMode": true,
"_useGrayscale": false,
"_atlas": null,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "d35G5blftA27sMYOVYUT4h"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "edJUwnclRHraYFEO2HroRN",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 104,
"height": 75
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "a7pn5tzA1BSI1AfdpVsHh7"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "9b809af9-120e-4683-a90a-5fecbd4e1ebd",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "9b809af9-120e-4683-a90a-5fecbd4e1ebd",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63z5ZyjTNKYbn+kEVB1s3W"
},
{
"__type__": "0f3c4JhFbFO2rEFqBJJ7hFv",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "32SLcINL1JHZ+vIyextzaC"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "cfqCWnxbFLNoQMedQXsav3",
"instance": null,
"targetOverrides": null
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 783 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -7,11 +7,11 @@
"embeddedPlayerGroups": [] "embeddedPlayerGroups": []
}, },
"_native": "", "_native": "",
"sample": 5, "sample": 1,
"speed": 1, "speed": 1,
"wrapMode": 2, "wrapMode": 2,
"enableTrsBlending": false, "enableTrsBlending": false,
"_duration": 6, "_duration": 30,
"_hash": 500763545, "_hash": 500763545,
"_tracks": [ "_tracks": [
{ {
@@ -77,7 +77,7 @@
"__type__": "cc.RealCurve", "__type__": "cc.RealCurve",
"_times": [ "_times": [
0, 0,
6 30
], ],
"_values": [ "_values": [
{ {
@@ -90,7 +90,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
}, },
{ {
"__type__": "cc.RealKeyframeValue", "__type__": "cc.RealKeyframeValue",
@@ -102,7 +104,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
} }
], ],
"preExtrapolation": 1, "preExtrapolation": 1,
@@ -118,7 +122,7 @@
"__type__": "cc.RealCurve", "__type__": "cc.RealCurve",
"_times": [ "_times": [
0, 0,
6 30
], ],
"_values": [ "_values": [
{ {
@@ -131,7 +135,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
}, },
{ {
"__type__": "cc.RealKeyframeValue", "__type__": "cc.RealKeyframeValue",
@@ -143,7 +149,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
} }
], ],
"preExtrapolation": 1, "preExtrapolation": 1,
@@ -159,7 +167,7 @@
"__type__": "cc.RealCurve", "__type__": "cc.RealCurve",
"_times": [ "_times": [
0, 0,
6 30
], ],
"_values": [ "_values": [
{ {
@@ -172,7 +180,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
}, },
{ {
"__type__": "cc.RealKeyframeValue", "__type__": "cc.RealKeyframeValue",
@@ -184,7 +194,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
} }
], ],
"preExtrapolation": 1, "preExtrapolation": 1,
@@ -251,7 +263,7 @@
"__type__": "cc.RealCurve", "__type__": "cc.RealCurve",
"_times": [ "_times": [
0, 0,
6 30
], ],
"_values": [ "_values": [
{ {
@@ -264,7 +276,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
}, },
{ {
"__type__": "cc.RealKeyframeValue", "__type__": "cc.RealKeyframeValue",
@@ -276,7 +290,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
} }
], ],
"preExtrapolation": 1, "preExtrapolation": 1,
@@ -292,7 +308,7 @@
"__type__": "cc.RealCurve", "__type__": "cc.RealCurve",
"_times": [ "_times": [
0, 0,
6 30
], ],
"_values": [ "_values": [
{ {
@@ -305,7 +321,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
}, },
{ {
"__type__": "cc.RealKeyframeValue", "__type__": "cc.RealKeyframeValue",
@@ -317,7 +335,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
} }
], ],
"preExtrapolation": 1, "preExtrapolation": 1,
@@ -333,7 +353,7 @@
"__type__": "cc.RealCurve", "__type__": "cc.RealCurve",
"_times": [ "_times": [
0, 0,
6 30
], ],
"_values": [ "_values": [
{ {
@@ -346,7 +366,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
}, },
{ {
"__type__": "cc.RealKeyframeValue", "__type__": "cc.RealKeyframeValue",
@@ -358,7 +380,9 @@
"leftTangent": 0, "leftTangent": 0,
"leftTangentWeight": 1, "leftTangentWeight": 1,
"easingMethod": 0, "easingMethod": 0,
"__editorExtras__": null "__editorExtras__": {
"broken": null
}
} }
], ],
"preExtrapolation": 1, "preExtrapolation": 1,

View File

@@ -710,10 +710,10 @@
"_string": "点击开始游戏", "_string": "点击开始游戏",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 36, "_actualFontSize": 51,
"_fontSize": 35, "_fontSize": 50,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 40, "_lineHeight": 50,
"_overflow": 2, "_overflow": 2,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
@@ -732,7 +732,7 @@
"b": 0, "b": 0,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 4,
"_enableShadow": false, "_enableShadow": false,
"_shadowColor": { "_shadowColor": {
"__type__": "cc.Color", "__type__": "cc.Color",

View File

@@ -406,7 +406,7 @@
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0, "x": 0,
"y": 279.527, "y": 418.633,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -707,13 +707,13 @@
"b": 255, "b": 255,
"a": 255 "a": 255
}, },
"_string": "点击开始游戏", "_string": "选择一个战斗技能",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 36, "_actualFontSize": 46,
"_fontSize": 35, "_fontSize": 45,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 40, "_lineHeight": 50,
"_overflow": 2, "_overflow": 2,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
@@ -732,7 +732,7 @@
"b": 0, "b": 0,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 3,
"_enableShadow": false, "_enableShadow": false,
"_shadowColor": { "_shadowColor": {
"__type__": "cc.Color", "__type__": "cc.Color",
@@ -762,8 +762,6 @@
"__id__": 0 "__id__": 0
}, },
"fileId": "25KvUjWTBKZq5B20vwtseT", "fileId": "25KvUjWTBKZq5B20vwtseT",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null "nestedPrefabInstanceRoots": null
}, },
{ {
@@ -1178,14 +1176,14 @@
"__prefab": { "__prefab": {
"__id__": 49 "__id__": 49
}, },
"_alignFlags": 40, "_alignFlags": 42,
"_target": null, "_target": null,
"_left": 0, "_left": 0,
"_right": 0, "_right": 0,
"_top": 590, "_top": 590,
"_bottom": 590, "_bottom": 590,
"_horizontalCenter": 0, "_horizontalCenter": 0,
"_verticalCenter": 0, "_verticalCenter": 418.633,
"_isAbsLeft": true, "_isAbsLeft": true,
"_isAbsRight": true, "_isAbsRight": true,
"_isAbsTop": true, "_isAbsTop": true,

View File

@@ -402,7 +402,7 @@
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0, "x": 0,
"y": 0, "y": 248.35000000000002,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -703,13 +703,13 @@
"b": 255, "b": 255,
"a": 255 "a": 255
}, },
"_string": "点击开始游戏", "_string": "选中卡牌向上滑动,召唤英雄",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 36, "_actualFontSize": 41,
"_fontSize": 35, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 40, "_lineHeight": 50,
"_overflow": 2, "_overflow": 2,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
@@ -728,7 +728,7 @@
"b": 0, "b": 0,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 4,
"_enableShadow": false, "_enableShadow": false,
"_shadowColor": { "_shadowColor": {
"__type__": "cc.Color", "__type__": "cc.Color",
@@ -1174,12 +1174,12 @@
"__prefab": { "__prefab": {
"__id__": 49 "__id__": 49
}, },
"_alignFlags": 40, "_alignFlags": 44,
"_target": null, "_target": null,
"_left": 0, "_left": 0,
"_right": 0, "_right": 0,
"_top": 590, "_top": 590,
"_bottom": 590, "_bottom": 788.35,
"_horizontalCenter": 0, "_horizontalCenter": 0,
"_verticalCenter": 0, "_verticalCenter": 0,
"_isAbsLeft": true, "_isAbsLeft": true,
@@ -1303,7 +1303,6 @@
"__id__": 0 "__id__": 0
}, },
"fileId": "6dh4o/8p1Cy5An1p6o4Bc3", "fileId": "6dh4o/8p1Cy5An1p6o4Bc3",
"instance": null, "instance": null
"targetOverrides": null
} }
] ]

View File

@@ -335,12 +335,12 @@
"__prefab": { "__prefab": {
"__id__": 14 "__id__": 14
}, },
"_alignFlags": 0, "_alignFlags": 36,
"_target": null, "_target": null,
"_left": 0, "_left": 651.948,
"_right": 0, "_right": 67.05200000000002,
"_top": 0, "_top": 0,
"_bottom": 0, "_bottom": 50.20600000000002,
"_horizontalCenter": 0, "_horizontalCenter": 0,
"_verticalCenter": 0, "_verticalCenter": 0,
"_isAbsLeft": true, "_isAbsLeft": true,
@@ -349,7 +349,7 @@
"_isAbsBottom": true, "_isAbsBottom": true,
"_isAbsHorizontalCenter": true, "_isAbsHorizontalCenter": true,
"_isAbsVerticalCenter": true, "_isAbsVerticalCenter": true,
"_originalWidth": 0, "_originalWidth": 1,
"_originalHeight": 0, "_originalHeight": 0,
"_alignMode": 2, "_alignMode": 2,
"_lockFlags": 0, "_lockFlags": 0,
@@ -707,13 +707,13 @@
"b": 255, "b": 255,
"a": 255 "a": 255
}, },
"_string": "点击开始游戏", "_string": "点击「战斗」进入战斗阶段",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 36, "_actualFontSize": 41,
"_fontSize": 35, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 40, "_lineHeight": 50,
"_overflow": 2, "_overflow": 2,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
@@ -732,7 +732,7 @@
"b": 0, "b": 0,
"a": 255 "a": 255
}, },
"_outlineWidth": 2, "_outlineWidth": 4,
"_enableShadow": false, "_enableShadow": false,
"_shadowColor": { "_shadowColor": {
"__type__": "cc.Color", "__type__": "cc.Color",

View File

@@ -38,10 +38,13 @@
"_components": [ "_components": [
{ {
"__id__": 102 "__id__": 102
},
{
"__id__": 104
} }
], ],
"_prefab": { "_prefab": {
"__id__": 104 "__id__": 106
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -240,7 +243,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "m7", "_name": "h",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -618,7 +621,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "a1", "_name": "h",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -996,7 +999,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "k1", "_name": "h",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -1208,7 +1211,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "hero2", "_name": "hero4",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -1374,7 +1377,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "m1", "_name": "h",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -1586,7 +1589,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "hero4", "_name": "hero5",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -1752,7 +1755,7 @@
}, },
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "h1", "_name": "h",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": { "_parent": {
@@ -1990,6 +1993,39 @@
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "f2zvSV135PlYuUfadiV2hO" "fileId": "f2zvSV135PlYuUfadiV2hO"
}, },
{
"__type__": "46ae531x0VGib728jAKeNFe",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 105
},
"hero1": {
"__id__": 42
},
"hero2": {
"__id__": 62
},
"hero3": {
"__id__": 2
},
"hero4": {
"__id__": 62
},
"hero5": {
"__id__": 82
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "86bacQ+jZMOokmXQGUf5Ed"
},
{ {
"__type__": "cc.PrefabInfo", "__type__": "cc.PrefabInfo",
"root": { "root": {

View File

@@ -351,18 +351,18 @@
"_dstBlendFactor": 4, "_dstBlendFactor": 4,
"_color": { "_color": {
"__type__": "cc.Color", "__type__": "cc.Color",
"r": 0, "r": 255,
"g": 0, "g": 255,
"b": 0, "b": 255,
"a": 88 "a": 255
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@1be8d", "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@b9538",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 0, "_type": 0,
"_fillType": 0, "_fillType": 0,
"_sizeMode": 1, "_sizeMode": 0,
"_fillCenter": { "_fillCenter": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
"x": 0, "x": 0,
@@ -372,7 +372,10 @@
"_fillRange": 0, "_fillRange": 0,
"_isTrimmedMode": true, "_isTrimmedMode": true,
"_useGrayscale": false, "_useGrayscale": false,
"_atlas": null, "_atlas": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": "" "_id": ""
}, },
{ {

View File

@@ -180,7 +180,7 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0, "x": -259.716,
"y": 0, "y": 0,
"z": 0 "z": 0
}, },
@@ -271,7 +271,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 510, "width": 300,
"height": 66 "height": 66
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -313,7 +313,7 @@
}, },
"_type": 1, "_type": 1,
"_fillType": 0, "_fillType": 0,
"_sizeMode": 1, "_sizeMode": 0,
"_fillCenter": { "_fillCenter": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
"x": 0, "x": 0,
@@ -443,7 +443,7 @@
"b": 255, "b": 255,
"a": 255 "a": 255
}, },
"_string": "第 1/20 波", "_string": "第 1 波",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 26, "_actualFontSize": 26,
@@ -821,8 +821,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0, "x": 295.012,
"y": -36.584, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -1110,8 +1110,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 100, "width": 720,
"height": 100 "height": 50
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -1136,11 +1136,11 @@
"__prefab": { "__prefab": {
"__id__": 44 "__id__": 44
}, },
"_alignFlags": 17, "_alignFlags": 41,
"_target": null, "_target": null,
"_left": 0, "_left": 0,
"_right": 0, "_right": 0,
"_top": 39.067999999999984, "_top": 64.06799999999998,
"_bottom": 0, "_bottom": 0,
"_horizontalCenter": 0, "_horizontalCenter": 0,
"_verticalCenter": 0, "_verticalCenter": 0,
@@ -1150,7 +1150,7 @@
"_isAbsBottom": true, "_isAbsBottom": true,
"_isAbsHorizontalCenter": true, "_isAbsHorizontalCenter": true,
"_isAbsVerticalCenter": true, "_isAbsVerticalCenter": true,
"_originalWidth": 0, "_originalWidth": 100,
"_originalHeight": 0, "_originalHeight": 0,
"_alignMode": 2, "_alignMode": 2,
"_lockFlags": 0, "_lockFlags": 0,
@@ -14302,7 +14302,7 @@
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 761.798, "x": 761.798,
"y": 640, "y": 1020,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -14903,11 +14903,11 @@
"__prefab": { "__prefab": {
"__id__": 701 "__id__": 701
}, },
"_alignFlags": 2, "_alignFlags": 1,
"_target": null, "_target": null,
"_left": 0, "_left": 0,
"_right": 0, "_right": 0,
"_top": 448.34799999999996, "_top": 200,
"_bottom": 0, "_bottom": 0,
"_horizontalCenter": 0, "_horizontalCenter": 0,
"_verticalCenter": 0, "_verticalCenter": 0,
@@ -15377,7 +15377,7 @@
"propertyPath": [ "propertyPath": [
"_active" "_active"
], ],
"value": true "value": false
}, },
{ {
"__type__": "CCPropertyOverrideInfo", "__type__": "CCPropertyOverrideInfo",

View File

@@ -1386,7 +1386,7 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -180, "x": -240,
"y": 0, "y": 0,
"z": 0 "z": 0
}, },
@@ -1785,7 +1785,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 180, "width": 240,
"height": 110 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -2387,7 +2387,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 180, "width": 240,
"height": 110 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -2910,7 +2910,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 180, "width": 240,
"height": 110 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -3509,7 +3509,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 180, "width": 240,
"height": 110 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -4764,7 +4764,7 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 180, "x": 240,
"y": 0, "y": 0,
"z": 0 "z": 0
}, },
@@ -5163,7 +5163,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 180, "width": 240,
"height": 110 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -5765,7 +5765,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 180, "width": 240,
"height": 110 "height": 110
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -9317,7 +9317,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 540, "width": 720,
"height": 200 "height": 200
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -9345,8 +9345,8 @@
}, },
"_alignFlags": 44, "_alignFlags": 44,
"_target": null, "_target": null,
"_left": 90, "_left": 0,
"_right": 90, "_right": 0,
"_top": 0, "_top": 0,
"_bottom": -2, "_bottom": -2,
"_horizontalCenter": 0, "_horizontalCenter": 0,

View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "dedd7eec-c366-427a-a253-1cd907c8dc69",
"files": [],
"subMetas": {},
"userData": {}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "db35468f-265d-4465-86ba-5186c6c1d0a2",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "82584d50-d744-4717-bba9-a74cf21c136d",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "b03d05c0-ce55-4f75-b4ef-214d0151a240",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "32a28430-53ab-4444-a65a-140412486986",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "62669db4-c83b-4438-9a93-150260d92408",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "7c92881a-8fe9-4c48-bbe0-8f1989d6e3f1",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "683c1c7a-97da-4694-a96a-f83df6575d73",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "8c59d18e-9b43-46e5-8249-39d98ffec825",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

View File

@@ -16,6 +16,8 @@ import { FightSet } from "./config/GameSet";
*/ */
export interface GameDate { export interface GameDate {
gold: number, gold: number,
switch_effect?: boolean, // 音效开关
switch_music?: boolean, // 音乐开关
timestamp?: number, // 用于比对本地与云端数据的最新状态 timestamp?: number, // 用于比对本地与云端数据的最新状态
} }
export interface CloudData { export interface CloudData {
@@ -129,6 +131,8 @@ export class SingletonModuleComp extends ecs.Comp {
} as GameScoreStats, } as GameScoreStats,
gold: 0, // 金币数据MVVM绑定字段 gold: 0, // 金币数据MVVM绑定字段
switch_effect: true, // 音效开关MVVM绑定字段
switch_music: true, // 音乐开关MVVM绑定字段
}; };
@@ -219,6 +223,16 @@ export class SingletonModuleComp extends ecs.Comp {
if (data.gold !== undefined) { if (data.gold !== undefined) {
this.vmdata.gold = data.gold; this.vmdata.gold = data.gold;
} }
// 同步音效开关
if (data.switch_effect !== undefined) {
this.vmdata.switch_effect = data.switch_effect;
if (oops.audio) oops.audio.switchEffect = data.switch_effect;
}
// 同步音乐开关
if (data.switch_music !== undefined) {
this.vmdata.switch_music = data.switch_music;
if (oops.audio) oops.audio.switchMusic = data.switch_music;
}
} }
// 触发UI更新 // 触发UI更新
@@ -231,6 +245,8 @@ export class SingletonModuleComp extends ecs.Comp {
getGameDate() { getGameDate() {
let data: GameDate = { let data: GameDate = {
gold: this.vmdata.gold, gold: this.vmdata.gold,
switch_effect: this.vmdata.switch_effect,
switch_music: this.vmdata.switch_music,
timestamp: Date.now() // 每次获取当前数据结构时都附带最新的时间戳 timestamp: Date.now() // 每次获取当前数据结构时都附带最新的时间戳
}; };
return data; return data;
@@ -245,6 +261,22 @@ export class SingletonModuleComp extends ecs.Comp {
return true return true
} }
updateSwitchEffect(isOpen: boolean, is_sync: boolean = true) {
this.vmdata.switch_effect = isOpen;
if (oops.audio) oops.audio.switchEffect = isOpen;
if (is_sync) {
gameDataSync.markDataDirty();
}
}
updateSwitchMusic(isOpen: boolean, is_sync: boolean = true) {
this.vmdata.switch_music = isOpen;
if (oops.audio) oops.audio.switchMusic = isOpen;
if (is_sync) {
gameDataSync.markDataDirty();
}
}
/** /**
* 在游戏载入早期调用,预加载常用图集 * 在游戏载入早期调用,预加载常用图集
*/ */

View File

@@ -35,6 +35,7 @@ export enum FightSet {
FiIGHT_TIME = 30,//战斗时间 FiIGHT_TIME = 30,//战斗时间
// BACK_CHANCE=40,//击退概率 // BACK_CHANCE=40,//击退概率
FROST_TIME = 3,//冰冻时间 FROST_TIME = 3,//冰冻时间
STUN_TIME = 2,//击晕时间
SKILL_CAST_DELAY = 0.15, SKILL_CAST_DELAY = 0.15,
CSKILL_START_X = -340, CSKILL_START_X = -340,
CSKILL_START_Y = 30, CSKILL_START_Y = 30,

View File

@@ -29,6 +29,8 @@ export enum Attrs {
// ==================== 特殊效果属性 ==================== // ==================== 特殊效果属性 ====================
freeze_chance = "freeze_chance", // 冰冻概率 freeze_chance = "freeze_chance", // 冰冻概率
freeze_res = "freeze_res", // 冰冻抗性 freeze_res = "freeze_res", // 冰冻抗性
stun_chance = "stun_chance", // 击晕概率
stun_res = "stun_res", // 击晕抗性
knockback_chance = "knockback_chance", // 击退概率 knockback_chance = "knockback_chance", // 击退概率
knockback_distance = "knockback_distance", // 击退距离强化 knockback_distance = "knockback_distance", // 击退距离强化
knockback_res = "knockback_res", // 击退抗性 knockback_res = "knockback_res", // 击退抗性

View File

@@ -72,6 +72,7 @@ function buildEffectDesc(skill: ReturnType<typeof mergeSkillParams>): string {
if (skill.crt) parts.push(`暴击+${skill.crt}%`); if (skill.crt) parts.push(`暴击+${skill.crt}%`);
// 附加冰冻概率 // 附加冰冻概率
if (skill.frz) parts.push(`冰冻+${skill.frz}%`); if (skill.frz) parts.push(`冰冻+${skill.frz}%`);
if (skill.stun) parts.push(`击晕+${skill.stun}%`);
// 附加击退概率 // 附加击退概率
if (skill.bck) parts.push(`击退+${skill.bck}%`); if (skill.bck) parts.push(`击退+${skill.bck}%`);
} }
@@ -109,7 +110,7 @@ export function buildSkillDesc(hero: heroInfo): string {
// 通过 s_uuid 查找技能基础配置 // 通过 s_uuid 查找技能基础配置
const base = SkillSet[item.s_uuid]; const base = SkillSet[item.s_uuid];
if (!base) continue; if (!base) continue;
// 合并 overrides 得到实际技能参数ap/hit_count/crt/frz/bck 等可能被覆盖) // 合并 overrides 得到实际技能参数ap/hit_count/crt/frz/stun/bck 等可能被覆盖)
const skill = mergeSkillParams(base, item.overrides); const skill = mergeSkillParams(base, item.overrides);
// 将模板中的 "n" 替换为实际触发次数 // 将模板中的 "n" 替换为实际触发次数
const trigger = tpl.replace("n", String(item.t_num)); const trigger = tpl.replace("n", String(item.t_num));

View File

@@ -150,6 +150,7 @@ export interface SkillConfig {
kind?: SkillKind, // 主效果类型 kind?: SkillKind, // 主效果类型
crt?: number, // 额外暴击率 crt?: number, // 额外暴击率
frz?: number, // 额外冰冻概率 frz?: number, // 额外冰冻概率
stun?: number, // 额外击晕概率
bck?: number, // 额外击退概率 bck?: number, // 额外击退概率
buff_type?: Attrs, // Buff 类型 (单一职责) buff_type?: Attrs, // Buff 类型 (单一职责)
call_hero?: number, // 召唤技能召唤英雄id(可选) call_hero?: number, // 召唤技能召唤英雄id(可选)
@@ -164,8 +165,10 @@ export interface SkillOverrides {
hitcd?: number; hitcd?: number;
crt?: number; crt?: number;
frz?: number; frz?: number;
stun?: number;
bck?: number; bck?: number;
buff_type?: Attrs; buff_type?: Attrs;
call_hero?: number;
} }
/** /**
@@ -183,13 +186,13 @@ export function mergeSkillParams(config: SkillConfig, overrides?: SkillOverrides
} }
export const SkillUpList = { export const SkillUpList = {
1001: { ap: 0, hit_count: 0, buff_ap: 0, buff_hp: 0, bck: 0, frz: 0, crt: 0, num: 0 } 1001: { ap: 0, hit_count: 0, buff_ap: 0, buff_hp: 0, bck: 0, frz: 0, stun: 0, crt: 0, num: 0 }
} }
/****** /******
* *
* 射箭类技能 带暴击属性 * 射箭类技能 带暴击属性
* 火法技能 带击退属性 * 火法技能
* 冰法技能 带冰冻属性 * 冰法技能 带冰冻属性
* *
*/ */
@@ -213,18 +216,18 @@ export const SkillSet: Record<number, SkillConfig> = {
6004: { 6004: {
uuid: 6004, name: "光箭绿", sp_name: "atk_c3", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6004, name: "光箭绿", sp_name: "atk_c3", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标", RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
}, },
//怪物战士类型统一使用 6005 //怪物战士类型统一使用 6005
6005: { 6005: {
uuid: 6005, name: "光箭深红", sp_name: "atk_c4", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6005, name: "光箭深红", sp_name: "atk_c4", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标", RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
}, },
6006: { 6006: {
uuid: 6006, name: "光箭灰白", sp_name: "atk_c5", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6006, name: "光箭灰白", sp_name: "atk_c5", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标", RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
}, },
6007: { 6007: {
uuid: 6007, name: "水球", sp_name: "ball_water", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6007, name: "水球", sp_name: "ball_water", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
@@ -249,13 +252,13 @@ export const SkillSet: Record<number, SkillConfig> = {
6101: { 6101: {
uuid: 6101, name: "火球", sp_name: "ball_fire", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6101, name: "火球", sp_name: "ball_fire", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, frz: 0, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, stun: 0, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,一定几率暴击,高阶技能", RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,一定几率暴击,高阶技能",
}, },
6102: { 6102: {
uuid: 6102, name: "龙卷风", sp_name: "ball_winds", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6102, name: "龙卷风", sp_name: "ball_winds", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,一定几率击退目标,高阶技能", RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,高阶技能",
}, },
//怪物法师统一使用 暗影球 //怪物法师统一使用 暗影球
6103: { 6103: {
@@ -269,14 +272,14 @@ export const SkillSet: Record<number, SkillConfig> = {
RType: RType.linear, EType: EType.collision, info: "射出强力箭矢最多穿透6个敌人附带20%额外暴击率", RType: RType.linear, EType: EType.collision, info: "射出强力箭矢最多穿透6个敌人附带20%额外暴击率",
}, },
6105: { 6105: {
uuid: 6105, name: "冰刺", sp_name: "ice_up", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max", uuid: 6105, name: "雷爆", sp_name: "ice_up", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max",
DTType: DTType.range, frz: 0, ap: 150, hit_count: 6, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.range, stun: 0, ap: 150, hit_count: 6, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.fixedEnd, EType: EType.animationEnd, info: "召唤冰刺攻击一排的敌人,有概率冰冻", RType: RType.fixedEnd, EType: EType.animationEnd, info: "召唤雷爆攻击一排的敌人,有概率击晕",
}, },
6106: { 6106: {
uuid: 6106, name: "冰推", sp_name: "ice_t", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max", uuid: 6106, name: "雷墙", sp_name: "ice_t", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max",
DTType: DTType.range, frz: 0, ap: 150, hit_count: 6, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.range, stun: 0, ap: 150, hit_count: 6, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.fixed, EType: EType.animationEnd, info: "召唤墙阻挡敌人,有概率冰冻,100%击退", RType: RType.fixed, EType: EType.animationEnd, info: "召唤墙阻挡敌人,有概率击晕",
}, },
6107: { 6107: {
uuid: 6107, name: "陨石", sp_name: "fire_yuns", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "reds", endAnm: "", act: "max", uuid: 6107, name: "陨石", sp_name: "fire_yuns", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "reds", endAnm: "", act: "max",
@@ -322,19 +325,19 @@ export const SkillSet: Record<number, SkillConfig> = {
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.critical_damage, info: "全体友方暴击伤害提升20%持续1次", RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.critical_damage, info: "全体友方暴击伤害提升20%持续1次",
}, },
6405: { 6405: {
uuid: 6405, name: "冰冻强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk", uuid: 6405, name: "击晕强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support, DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.freeze_chance, info: "全体友方冰冻概率提升10%持续1次", RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.stun_chance, info: "全体友方击晕概率提升10%持续1次",
}, },
6406: { 6406: {
uuid: 6406, name: "击退强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk", uuid: 6406, name: "击退强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support, DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.knockback_chance, info: "全体友方击退概率提升10%持续1次", RType: RType.fixed, EType: EType.animationEnd, info: "暂未使用",
}, },
6407: { 6407: {
uuid: 6407, name: "距推强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk", uuid: 6407, name: "距推强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support, DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.knockback_distance, info: "全体友方击退距离提升20点持续1次", RType: RType.fixed, EType: EType.animationEnd, info: "暂未使用",
}, },
6408: { 6408: {
uuid: 6408, name: "穿刺强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_ap", endAnm: "", act: "atk", uuid: 6408, name: "穿刺强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_ap", endAnm: "", act: "atk",
@@ -363,7 +366,7 @@ export enum FieldSkillType {
SellGold = 6, // 卖出英雄金币提升 SellGold = 6, // 卖出英雄金币提升
WaveHeal = 7, // 战斗结束生命回复量提升 WaveHeal = 7, // 战斗结束生命回复量提升
HeroAtk = 8, // 英雄攻击力加成 HeroAtk = 8, // 英雄攻击力加成
HeroFrost = 9, // 英雄冰冻加成 HeroStun = 9, // 英雄击晕加成
HeroCrit = 10, // 英雄暴击加成 HeroCrit = 10, // 英雄暴击加成
HeroCritDamage = 11, // 英雄暴击伤害加成 HeroCritDamage = 11, // 英雄暴击伤害加成
HeroSpeed = 12, // 英雄攻击速度加成 HeroSpeed = 12, // 英雄攻击速度加成
@@ -393,7 +396,7 @@ export const FieldSkillSet: Record<number, FieldSkillConfig> = {
7006: { uuid: 7006, name: "出售强化", type: FieldSkillType.SellGold, value: 5, info: "卖出英雄金币+5" }, 7006: { uuid: 7006, name: "出售强化", type: FieldSkillType.SellGold, value: 5, info: "卖出英雄金币+5" },
7007: { uuid: 7007, name: "战后恢复", type: FieldSkillType.WaveHeal, value: 0.3, info: "战斗结束生命回复量+30%" }, 7007: { uuid: 7007, name: "战后恢复", type: FieldSkillType.WaveHeal, value: 0.3, info: "战斗结束生命回复量+30%" },
7008: { uuid: 7008, name: "攻击加成", type: FieldSkillType.HeroAtk, value: 0.2, info: "英雄攻击力+20%" }, 7008: { uuid: 7008, name: "攻击加成", type: FieldSkillType.HeroAtk, value: 0.2, info: "英雄攻击力+20%" },
7009: { uuid: 7009, name: "冰冻加成", type: FieldSkillType.HeroFrost, value: 0.1, info: "英雄冰冻概率+10%" }, 7009: { uuid: 7009, name: "击晕加成", type: FieldSkillType.HeroStun, value: 0.1, info: "英雄击晕概率+10%" },
7010: { uuid: 7010, name: "暴击加成", type: FieldSkillType.HeroCrit, value: 0.1, info: "英雄暴击率+10%" }, 7010: { uuid: 7010, name: "暴击加成", type: FieldSkillType.HeroCrit, value: 0.1, info: "英雄暴击率+10%" },
7011: { uuid: 7011, name: "暴伤加成", type: FieldSkillType.HeroCritDamage, value: 0.5, info: "英雄暴击伤害+50%" }, 7011: { uuid: 7011, name: "暴伤加成", type: FieldSkillType.HeroCritDamage, value: 0.5, info: "英雄暴击伤害+50%" },
7012: { uuid: 7012, name: "攻速加成", type: FieldSkillType.HeroSpeed, value: 0.2, info: "英雄攻击速度+20%" }, 7012: { uuid: 7012, name: "攻速加成", type: FieldSkillType.HeroSpeed, value: 0.2, info: "英雄攻击速度+20%" },

View File

@@ -268,33 +268,33 @@ export const HeroInfo: Record<number, heroInfo> = {
info:"驻场提供攻击力光环每2次攻击为全队叠加攻击力"}, info:"驻场提供攻击力光环每2次攻击为全队叠加攻击力"},
// ========== 冰冻控制流 (新加) ========== // ========== 击晕控制流 (新加) ==========
5106:{uuid:5106,name:"寒冰学徒",path:"hm3", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long, 5106:{uuid:5106,name:"雷爆学徒",path:"hm3", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long,
hp:130,ap:50, hp:130,ap:50,
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow1].cd,ccd:0}}, skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow1].cd,ccd:0}},
field:[6405], field:[6405],
atking:[{s_uuid:6405,t_num:2}], atking:[{s_uuid:6405,t_num:2}],
evolve:{ evolve:{
2:{atking:[{s_uuid:6105,t_num:3,overrides:{ap:100,frz:20}}]}, 2:{atking:[{s_uuid:6105,t_num:3,overrides:{ap:100,stun:20}}]},
3:{skill:{s_uuid:6105,overrides:{frz:15,hit_count:6}}, 3:{skill:{s_uuid:6105,overrides:{stun:15,hit_count:6}},
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,frz:35,hit_count:8}}], atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,stun:35,hit_count:8}}],
ap_bonus:30}, ap_bonus:30},
}, },
info:"驻场提供冰冻光环每2次普攻叠加冰冻概率"}, info:"驻场提供击晕光环每2次普攻叠加击晕概率"},
5107:{uuid:5107,name:"霜寒法师",path:"hm5", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long, 5107:{uuid:5107,name:"雷霆法师",path:"hm5", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long,
hp:160,ap:80, hp:160,ap:80,
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Normal3].cd,ccd:0}}, skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Normal3].cd,ccd:0}},
field:[6405], field:[6405],
atking:[{s_uuid:6105,t_num:2,overrides:{ap:120,frz:25}}], atking:[{s_uuid:6105,t_num:2,overrides:{ap:120,stun:25}}],
info:"驻场冰冻光环每2次攻击触发冰刺AOE25%冰冻概率住一排敌人"}, info:"驻场击晕光环每2次攻击触发雷爆AOE25%击晕概率住一排敌人"},
5108:{uuid:5108,name:"永冬贤者",path:"hm4", fac:FacSet.HERO,pool_lv:3,lv:1,type:HType.Long, 5108:{uuid:5108,name:"风暴贤者",path:"hm4", fac:FacSet.HERO,pool_lv:3,lv:1,type:HType.Long,
hp:250,ap:110, hp:250,ap:110,
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow3].cd,ccd:0}}, skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow3].cd,ccd:0}},
field:[6405], field:[6405],
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,frz:35,hit_count:8}}], atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,stun:35,hit_count:8}}],
info:"驻场强力冰冻光环,每次攻击释放冰刺35%冰冻概率"}, info:"驻场强力击晕光环,每次攻击释放雷爆35%击晕概率"},
// ========== 辅助英雄 (保留 5301, 5302) ========== // ========== 辅助英雄 (保留 5301, 5302) ==========
@@ -335,28 +335,28 @@ export const HeroInfo: Record<number, heroInfo> = {
// ========== 击退推拉流 ========== // ========== 穿刺风怒流 ==========
5209:{uuid:5209,name:"风弓手",path:"ha2", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long, 5209:{uuid:5209,name:"风弓手",path:"ha2", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long,
hp:140,ap:45, hp:140,ap:45,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast3].cd,ccd:0}}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast3].cd,ccd:0}},
atking:[{s_uuid:6406,t_num:2}], atking:[{s_uuid:6408,t_num:2}],
info:"快速射击每2次攻击为全队叠加击退概率"}, info:"快速射击每2次攻击为全队叠加穿透概率"},
5210:{uuid:5210,name:"龙卷猎手",path:"ha3", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long, 5210:{uuid:5210,name:"龙卷猎手",path:"ha3", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long,
hp:170,ap:70, hp:170,ap:70,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Normal2].cd,ccd:0}}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Normal2].cd,ccd:0}},
atking:[{s_uuid:6102,t_num:2,overrides:{bck:30,hit_count:3}}], atking:[{s_uuid:6102,t_num:2,overrides:{hit_count:3}}],
info:"每2次攻击释放龙卷风30%击退概率推开一排敌人"}, info:"每2次攻击释放龙卷风攻击一排敌人"},
5404:{uuid:5404,name:"风暴刺客",path:"hc2", fac:FacSet.HERO,pool_lv:4,lv:1,type:HType.Melee, 5404:{uuid:5404,name:"风暴刺客",path:"hc2", fac:FacSet.HERO,pool_lv:4,lv:1,type:HType.Melee,
hp:250,ap:100, hp:250,ap:100,
skills:{6001:{uuid:6001,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast2].cd,ccd:0}}, skills:{6001:{uuid:6001,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast2].cd,ccd:0}},
atking:[ atking:[
{s_uuid:6407,t_num:1}, {s_uuid:6409,t_num:1},
{s_uuid:6102,t_num:3,overrides:{bck:50,hit_count:5,ap:120}} {s_uuid:6102,t_num:3,overrides:{hit_count:5,ap:120}}
], ],
dead:[{s_uuid:6406,t_num:1}], dead:[{s_uuid:6408,t_num:1}],
info:"极速近战,每次攻击给全队加击退距离每3次攻击释放龙卷风死后全队永久击退率加成"}, info:"极速近战,每次攻击给全队加风怒次数每3次攻击释放龙卷风死后全队永久穿透率加成"},
// ========== 暴击爆发流 ========== // ========== 暴击爆发流 ==========
5211:{uuid:5211,name:"猎鹰射手",path:"ha4", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long, 5211:{uuid:5211,name:"猎鹰射手",path:"ha4", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long,
@@ -496,7 +496,7 @@ export const HeroList: number[] = [
5101, 5106, 5107, 5108, 5101, 5106, 5107, 5108,
// 治疗续航流 // 治疗续航流
5301, 5302, 5303, 5304, 5305, 5301, 5302, 5303, 5304, 5305,
// 击退推拉 // 穿刺风怒
5209, 5210, 5404, 5209, 5210, 5404,
// 暴击爆发流 // 暴击爆发流
5211, 5212, 5405, 5211, 5212, 5405,

View File

@@ -184,17 +184,31 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const freezeChance = (damageEvent.Attrs[Attrs.freeze_chance] || 0) - (TAttrsComp.freeze_res || 0); const freezeChance = (damageEvent.Attrs[Attrs.freeze_chance] || 0) - (TAttrsComp.freeze_res || 0);
const isFrost = !TAttrsComp.isFrost() && this.checkChance(freezeChance); const isFrost = !TAttrsComp.isFrost() && this.checkChance(freezeChance);
// 击晕判定
const stunChance = (damageEvent.Attrs[Attrs.stun_chance] || 0) - (TAttrsComp.stun_res || 0);
const isStun = !TAttrsComp.isStun() && this.checkChance(stunChance);
// 击退判定 // 击退判定
const knockbackChance = (damageEvent.Attrs[Attrs.knockback_chance] || 0) - (TAttrsComp.knockback_res || 0); const knockbackChance = (damageEvent.Attrs[Attrs.knockback_chance] || 0) - (TAttrsComp.knockback_res || 0);
const isKnockback = this.checkChance(knockbackChance); const isKnockback = this.checkChance(knockbackChance);
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击退) // ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击晕、击退)
if (targetView) { if (targetView) {
targetView.do_atked(damage, isCrit, damageEvent.s_uuid, false); targetView.do_atked(damage, isCrit, damageEvent.s_uuid, false);
targetView.playEnd(skillConf.endAnm); targetView.playEnd(skillConf.endAnm);
if (isFrost) { if (isFrost) {
TAttrsComp.toFrost(); TAttrsComp.toFrost();
targetView.in_iced(TAttrsComp.frost_end_time); targetView.in_iced(TAttrsComp.frost_end_time);
if (damageEvent.Attrs.fac === FacSet.HERO) {
smc.vmdata.scores.freeze_count++;
}
}
if (isStun) {
TAttrsComp.toStun();
targetView.in_stun(TAttrsComp.stun_end_time);
if (damageEvent.Attrs.fac === FacSet.HERO) {
smc.vmdata.scores.stun_count++;
}
} }
if (isKnockback) { if (isKnockback) {
targetView.back(damageEvent.Attrs[Attrs.knockback_distance] || 0); targetView.back(damageEvent.Attrs[Attrs.knockback_distance] || 0);

View File

@@ -49,6 +49,8 @@ export class HeroAttrsComp extends ecs.Comp {
critical_res: number = 0; // 暴击抗性 critical_res: number = 0; // 暴击抗性
freeze_chance: number = 0; // 冰冻概率 freeze_chance: number = 0; // 冰冻概率
freeze_res: number = 0; // 冰冻抗性 freeze_res: number = 0; // 冰冻抗性
stun_chance: number = 0; // 击晕概率
stun_res: number = 0; // 击晕抗性
knockback_chance: number = 0; // 击退概率 knockback_chance: number = 0; // 击退概率
knockback_distance: number = 0; // 击退距离强化 knockback_distance: number = 0; // 击退距离强化
knockback_res: number = 0; // 击退抗性 knockback_res: number = 0; // 击退抗性
@@ -61,6 +63,7 @@ export class HeroAttrsComp extends ecs.Comp {
frost_end_time: number = 0; frost_end_time: number = 0;
stun_end_time: number = 0;
boom: boolean = false; // 自爆怪 boom: boolean = false; // 自爆怪
@@ -100,6 +103,7 @@ export class HeroAttrsComp extends ecs.Comp {
*/ */
initAttrs() { initAttrs() {
this.frost_end_time = 0; this.frost_end_time = 0;
this.stun_end_time = 0;
} }
/*******************基础属性管理********************/ /*******************基础属性管理********************/
@@ -162,11 +166,35 @@ export class HeroAttrsComp extends ecs.Comp {
const frostTime = FightSet.FROST_TIME * time; const frostTime = FightSet.FROST_TIME * time;
this.frost_end_time = Math.max(this.frost_end_time, frostTime); this.frost_end_time = Math.max(this.frost_end_time, frostTime);
} }
toStun(time: number=1) {
const stunTime = FightSet.STUN_TIME * time;
this.stun_end_time = Math.max(this.stun_end_time, stunTime);
// 击晕时 CD 清零
for (const key in this.skills) {
const skill = this.skills[key];
if (skill) {
skill.ccd = 0;
}
}
}
updateCD(dt: number){ updateCD(dt: number){
// 如果处于冰冻状态,则技能 CD 暂停刷新 // 如果处于冰冻状态,则技能 CD 暂停刷新
if (this.isFrost()) return; if (this.isFrost()) return;
// 如果处于击晕状态,则技能 CD 暂停刷新(且保持清零状态)
if (this.isStun()) {
for (const key in this.skills) {
const skill = this.skills[key];
if (skill) {
skill.ccd = 0;
}
}
return;
}
for (const key in this.skills) { for (const key in this.skills) {
const skill = this.skills[key]; const skill = this.skills[key];
if (!skill) continue; if (!skill) continue;
@@ -185,6 +213,9 @@ export class HeroAttrsComp extends ecs.Comp {
isFrost(): boolean { isFrost(): boolean {
return this.frost_end_time > 0 return this.frost_end_time > 0
} }
isStun(): boolean {
return this.stun_end_time > 0
}
getSkillLevel(skillId: number): number { getSkillLevel(skillId: number): number {
if (!skillId) return 0; if (!skillId) return 0;
return this.skills[skillId]?.lv ?? 0; return this.skills[skillId]?.lv ?? 0;
@@ -242,7 +273,13 @@ export class HeroAttrsComp extends ecs.Comp {
/** 英雄实时冰冻率 = 基础冰冻率 + 驻场冰冻率。 */ /** 英雄实时冰冻率 = 基础冰冻率 + 驻场冰冻率。 */
public getRuntimeFreezeChance(): number { public getRuntimeFreezeChance(): number {
if (this.fac !== FacSet.HERO) return this.freeze_chance; if (this.fac !== FacSet.HERO) return this.freeze_chance;
return this.freeze_chance + HeroAttrsComp.getFieldPercentValue(FieldSkillType.HeroFrost); return this.freeze_chance;
}
/** 英雄实时击晕率 = 基础击晕率 + 驻场击晕率。 */
public getRuntimeStunChance(): number {
if (this.fac !== FacSet.HERO) return this.stun_chance;
return this.stun_chance + HeroAttrsComp.getFieldPercentValue(FieldSkillType.HeroStun);
} }
/** 英雄实时风怒概率 = 基础风怒 + 驻场风怒。 */ /** 英雄实时风怒概率 = 基础风怒 + 驻场风怒。 */
@@ -352,6 +389,8 @@ export class HeroAttrsComp extends ecs.Comp {
this.critical_res = 0; this.critical_res = 0;
this.freeze_chance = 0; this.freeze_chance = 0;
this.freeze_res = 0; this.freeze_res = 0;
this.stun_chance = 0;
this.stun_res = 0;
this.knockback_chance = 0; this.knockback_chance = 0;
this.knockback_distance = 0; this.knockback_distance = 0;
this.knockback_res = 0; this.knockback_res = 0;
@@ -363,6 +402,7 @@ export class HeroAttrsComp extends ecs.Comp {
this.boom = false; this.boom = false;
this.frost_end_time = 0; this.frost_end_time = 0;
this.stun_end_time = 0;
// 重置技能距离缓存 // 重置技能距离缓存
this.maxSkillDistance = 0; this.maxSkillDistance = 0;
@@ -406,7 +446,12 @@ export class HeroBuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
attrsComp.frost_end_time = 0; attrsComp.frost_end_time = 0;
} }
} }
if(attrsComp.stun_end_time > 0){
attrsComp.stun_end_time -= 0.1;
if(attrsComp.stun_end_time <= 0){
attrsComp.stun_end_time = 0;
}
}
} }
void e; void e;
} }

View File

@@ -8,7 +8,7 @@ export class HeroSpine extends Component {
@property(HeroAnmComp) @property(HeroAnmComp)
anm: HeroAnmComp = null; anm: HeroAnmComp = null;
status:string="idle"; status:string="";
onLoad() { onLoad() {
// 角色控制组件 // 角色控制组件

View File

@@ -31,7 +31,7 @@ export class HeroViewComp extends CCComp {
// ==================== View 层属性(表现相关)==================== // ==================== View 层属性(表现相关)====================
as: HeroSpine = null! as: HeroSpine = null!
status:String = "idle" status:String = ""
scale: number = 1; // 显示方向 scale: number = 1; // 显示方向
box_group:number = BoxSet.HERO; // 碰撞组 box_group:number = BoxSet.HERO; // 碰撞组
realDeadTime:number=0.1 realDeadTime:number=0.1
@@ -89,6 +89,7 @@ export class HeroViewComp extends CCComp {
private onHeroClicked() { private onHeroClicked() {
if (!this.model) return; if (!this.model) return;
if (this.model.fac !== FacSet.HERO) return; if (this.model.fac !== FacSet.HERO) return;
oops.audio.playEffect("music/button");
const eid = this.ent?.eid; const eid = this.ent?.eid;
if (!eid) return; if (!eid) return;
@@ -104,10 +105,10 @@ export class HeroViewComp extends CCComp {
/** 初始化/重置视图状态 */ /** 初始化/重置视图状态 */
init() { init() {
this.status = "idle"; this.status = "";
this.deadCD = 0; this.deadCD = 0;
this.lastBarUpdateTime = 0; this.lastBarUpdateTime = 0;
this.as.idle() this.status_change("idle");
// 初始化 UI 节点 // 初始化 UI 节点
this.initUINodes(); this.initUINodes();
@@ -308,6 +309,11 @@ export class HeroViewComp extends CCComp {
this.spawnTimedFx("game/skill/buff/iced", this.node, t); this.spawnTimedFx("game/skill/buff/iced", this.node, t);
} }
/** 击晕特效 */
in_stun(t: number = 1) {
this.spawnTimedFx("game/skill/buff/stun", this.node, t);
}
/** 技能提示 */ /** 技能提示 */
private tooltip(type: number = 1, value: string = "", s_uuid: number = 1001, y: number = 50) { private tooltip(type: number = 1, value: string = "", s_uuid: number = 1001, y: number = 50) {
let pos = v3(0, 60); let pos = v3(0, 60);
@@ -518,6 +524,13 @@ export class HeroViewComp extends CCComp {
if (damage <= 0) return; if (damage <= 0) return;
// 播放受击音效
if (isCrit) {
oops.audio.playEffect("music/Critical");
} else {
oops.audio.playEffect("music/Hit");
}
// 视图层表现 // 视图层表现
let SConf=SkillSet[s_uuid] let SConf=SkillSet[s_uuid]
const hitAnm = SConf?.DAnm|| "atked"; const hitAnm = SConf?.DAnm|| "atked";

View File

@@ -194,6 +194,29 @@ export class Monster extends ecs.Entity {
// 最终技能等级 = 初始技能等级 + 怪物等级增量,且下限为 0 // 最终技能等级 = 初始技能等级 + 怪物等级增量,且下限为 0
model.skills[skill.uuid] = { ...skill, lv: Math.max(0,skill.lv + mon_lv - 2), ccd: 0 }; model.skills[skill.uuid] = { ...skill, lv: Math.max(0,skill.lv + mon_lv - 2), ccd: 0 };
} }
// 【测试模式专属】如果有覆盖技能配置则应用
const testSkills = (this as any)._testSkills;
if (testSkills) {
if (testSkills.skill !== undefined) {
// 如果是替换普攻,通常是修改 hero.skill 字段或从 model.skills 里清除并注入
model.skills = {};
if (testSkills.skill) {
model.skills[testSkills.skill.s_uuid] = {
uuid: testSkills.skill.s_uuid,
cd: testSkills.skill.cd ?? 0,
lv: 1,
ccd: 0,
overrides: testSkills.skill.overrides
};
}
}
if (testSkills.atking !== undefined) model.atking = testSkills.atking;
if (testSkills.atked !== undefined) model.atked = testSkills.atked;
if (testSkills.dead !== undefined) model.dead = testSkills.dead;
if (testSkills.fstart !== undefined) model.fstart = testSkills.fstart;
if (testSkills.fend !== undefined) model.fend = testSkills.fend;
}
// 缓存技能射程等派生数据,减少战斗帧内重复计算 // 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache(); model.updateSkillDistanceCache();

View File

@@ -110,6 +110,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
mockAttrs.ap = highestAp; mockAttrs.ap = highestAp;
mockAttrs.critical = 0; mockAttrs.critical = 0;
mockAttrs.freeze_chance = 0; mockAttrs.freeze_chance = 0;
mockAttrs.stun_chance = 0;
mockAttrs.puncture_chance = 0; mockAttrs.puncture_chance = 0;
mockAttrs.fac = FacSet.HERO; mockAttrs.fac = FacSet.HERO;
mockAttrs.type = HType.Long; // 假定为远程,拥有较长索敌范围 mockAttrs.type = HType.Long; // 假定为远程,拥有较长索敌范围
@@ -228,6 +229,9 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
heroView.playOther('yellow') heroView.playOther('yellow')
} }
// 播放特殊技能触发音效
oops.audio.playEffect("music/flash");
// 如果是敌方攻击技能,必须在战斗中才能释放;友方增益/护盾则允许在非战斗中释放 // 如果是敌方攻击技能,必须在战斗中才能释放;友方增益/护盾则允许在非战斗中释放
let config = SkillSet[s_uuid]; let config = SkillSet[s_uuid];
if (!config) return; if (!config) return;
@@ -482,7 +486,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
if (config.buff_type === Attrs.ap) upgradeValue = sUp.buff_ap || 0; if (config.buff_type === Attrs.ap) upgradeValue = sUp.buff_ap || 0;
else if (config.buff_type === Attrs.hp_max) upgradeValue = sUp.buff_hp || 0; else if (config.buff_type === Attrs.hp_max) upgradeValue = sUp.buff_hp || 0;
else if (config.buff_type === Attrs.critical) upgradeValue = sUp.crt || 0; else if (config.buff_type === Attrs.critical) upgradeValue = sUp.crt || 0;
// 如果后续有冰冻等,在这里加上对应的 sUp 字段即可,如 sUp.frz // 如果后续有冰冻、击晕等,在这里加上对应的 sUp 字段即可,如 sUp.frz / sUp.stun
const totalBuffValue = baseValue + upgradeValue; const totalBuffValue = baseValue + upgradeValue;

View File

@@ -4,7 +4,7 @@
* @LastEditors: dgflash * @LastEditors: dgflash
* @LastEditTime: 2022-08-17 12:38:59 * @LastEditTime: 2022-08-17 12:38:59
*/ */
import { Node } from "cc"; import { Node, Button } from "cc";
import { UICallbacks } from "../../../../extensions/oops-plugin-framework/assets/core/gui/layer/Defines"; import { UICallbacks } from "../../../../extensions/oops-plugin-framework/assets/core/gui/layer/Defines";
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { AsyncQueue, NextFunction } from "../../../../extensions/oops-plugin-framework/assets/libs/collection/AsyncQueue"; import { AsyncQueue, NextFunction } from "../../../../extensions/oops-plugin-framework/assets/libs/collection/AsyncQueue";
@@ -27,6 +27,19 @@ export class Initialize extends ecs.Entity {
debugMode: boolean = false; // 是否启用调试模式 debugMode: boolean = false; // 是否启用调试模式
protected init() { protected init() {
var queue: AsyncQueue = new AsyncQueue(); var queue: AsyncQueue = new AsyncQueue();
// --- 全局注入:为所有 Button 组件增加点击音效 ---
const originalOnTouchEnded = Button.prototype["_onTouchEnded"];
if (originalOnTouchEnded) {
Button.prototype["_onTouchEnded"] = function(event) {
if (this.interactable && this.node && this.node.activeInHierarchy) {
oops.audio.playEffect("music/button");
}
originalOnTouchEnded.call(this, event);
};
}
// ---------------------------------------------
// 加载自定义资 // 加载自定义资
this.loadCustom(queue); this.loadCustom(queue);
// 加载多语言包 // 加载多语言包

View File

@@ -275,8 +275,7 @@ export class HInfoComp extends CCComp {
this.previewPoolLv = poolLv; this.previewPoolLv = poolLv;
this.isSkillCard = isSkillCard; this.isSkillCard = isSkillCard;
if (this.sell_node) this.sell_node.active = false; if (this.sell_node) this.sell_node.active = false;
// 如果是技能卡预览模式(即点击了战场上的技能),允许关闭弹窗 if (this.close_node) this.close_node.active = true;
if (this.close_node) this.close_node.active = isSkillCard;
this.cacheLabels(); this.cacheLabels();
this.refresh(); this.refresh();
} }

View File

@@ -0,0 +1,90 @@
import { _decorator, Component, Node, Animation, Vec3 } from "cc";
const { ccclass, property } = _decorator;
@ccclass('HeroMoveComp')
export class HeroMoveComp extends Component {
@property({ type: Node })
hero1: Node = null!;
@property({ type: Node })
hero2: Node = null!;
@property({ type: Node })
hero3: Node = null!;
@property({ type: Node })
hero4: Node = null!;
@property({ type: Node })
hero5: Node = null!;
// 控制移动速度的基础参数
private baseSpeed: number = 20; // 每秒向右移动的基础像素速度
private timer: number = 0;
// 为每个英雄保存其对应的 Animation 和随机参数
private heroDatas: { node: Node, anim: Animation | null, startX: number, phase: number }[] = [];
onLoad() {
const heroes = [this.hero1, this.hero2, this.hero3, this.hero4, this.hero5];
heroes.forEach(heroNode => {
if (heroNode) {
// 查找名为 "h" 的子节点
const hNode = heroNode.getChildByName("h");
let anim: Animation | null = null;
if (hNode) {
anim = hNode.getComponent(Animation);
// 确保有动画组件才尝试播放
if (anim && anim.clips && anim.clips.length > 0) {
anim.play("move");
}
}
this.heroDatas.push({
node: heroNode,
anim: anim,
startX: heroNode.position.x, // 记录初始X位置
phase: Math.random() * Math.PI * 2 // 随机初始相位
});
}
});
}
update(dt: number) {
this.timer += dt;
this.heroDatas.forEach(data => {
if (!data.node) return;
// 设置周期为 4 秒 (例如1秒加速向右1秒减速回原点1秒减速向左1秒加速回原点)
// 使用正弦波控制速度,余弦波控制位移(因为速度是位移的导数)
const cycleDuration = 4;
const frequency = (Math.PI * 2) / cycleDuration;
// 速度倍率,范围在 0.9 ~ 1.1 之间波动
// sin 波形在 4秒周期内正负各占 2秒
const speedMultiplier = 1.0 + Math.sin(this.timer * frequency + data.phase) * 0.1;
// 调整动画的播放速度
if (data.anim) {
// 检查状态是否存在,以避免没有播放动画时的错误
const state = data.anim.getState("move");
if (state && state.isPlaying) {
state.speed = speedMultiplier;
} else if (data.anim.clips && data.anim.clips.length > 0) {
// 如果停止了,尝试重新播放
data.anim.play("move");
}
}
// 根据时间计算位置偏移量
// 使用 -cos 函数使得当速度sin为最大时位置在原点
// 积分关系:速度 v = A * sin(wt),位移 s = - (A/w) * cos(wt)
// 这样能保证在一个周期内它始终围绕原点往复运动,最终回到原始点
const maxOffset = 30; // 左右偏离原点的最大像素距离
const currentOffset = -Math.cos(this.timer * frequency + data.phase) * maxOffset;
const pos = data.node.position;
// 相对于初始点进行位置设置,确保周期性回到原始点
data.node.setPosition(new Vec3(data.startX + currentOffset, pos.y, pos.z));
});
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "46ae5df5-c745-4689-bef6-f2300a78d15e",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -643,6 +643,7 @@ export class MissionCardComp extends CCComp {
} }
/** 抽卡按钮释放 → 执行抽卡逻辑 */ /** 抽卡按钮释放 → 执行抽卡逻辑 */
private onDrawTouchEnd() { private onDrawTouchEnd() {
oops.audio.playEffect("music/button");
this.playButtonClickAnim(this.cards_chou, () => this.onClickDraw()); this.playButtonClickAnim(this.cards_chou, () => this.onClickDraw());
} }
/** 抽卡按钮取消 → 恢复缩放 */ /** 抽卡按钮取消 → 恢复缩放 */
@@ -655,6 +656,7 @@ export class MissionCardComp extends CCComp {
this.playButtonPressAnim(this.skill_refresh); this.playButtonPressAnim(this.skill_refresh);
} }
private onSkillDrawTouchEnd() { private onSkillDrawTouchEnd() {
oops.audio.playEffect("music/button");
this.playButtonClickAnim(this.skill_refresh, () => this.onClickSkillRefresh()); this.playButtonClickAnim(this.skill_refresh, () => this.onClickSkillRefresh());
} }
private onSkillDrawTouchCancel() { private onSkillDrawTouchCancel() {
@@ -665,6 +667,7 @@ export class MissionCardComp extends CCComp {
this.playButtonPressAnim(this.skill_ad_refresh); this.playButtonPressAnim(this.skill_ad_refresh);
} }
private onSkillAdDrawTouchEnd() { private onSkillAdDrawTouchEnd() {
oops.audio.playEffect("music/button");
this.playButtonClickAnim(this.skill_ad_refresh, () => this.onClickSkillAdRefresh()); this.playButtonClickAnim(this.skill_ad_refresh, () => this.onClickSkillAdRefresh());
} }
private onSkillAdDrawTouchCancel() { private onSkillAdDrawTouchCancel() {

View File

@@ -117,7 +117,7 @@ export class MissionComp extends CCComp {
// ======================== 运行时状态 ======================== // ======================== 运行时状态 ========================
/** 战斗已耗时(秒),正向计时 */ /** 本波战斗已耗时(秒),正向计时,用于自适应难度评估 */
clearTime: number = 0 clearTime: number = 0
/** 剩余复活次数 */ /** 剩余复活次数 */
revive_times: number = 1; revive_times: number = 1;
@@ -242,7 +242,7 @@ export class MissionComp extends CCComp {
/** 更新时间/波数显示(仅在秒数变化时更新以减少 Label 操作) */ /** 更新时间/波数显示(仅在秒数变化时更新以减少 Label 操作) */
update_time() { update_time() {
const remainSecond = Math.floor(this.clearTime); const remainSecond = Math.floor(smc.vmdata.mission_data.fight_time);
if (remainSecond === this.lastTimeSecond) return; if (remainSecond === this.lastTimeSecond) return;
this.lastTimeSecond = remainSecond; this.lastTimeSecond = remainSecond;
let m = Math.floor(remainSecond / 60); let m = Math.floor(remainSecond / 60);
@@ -307,6 +307,10 @@ export class MissionComp extends CCComp {
loading.active = false loading.active = false
}, 0.5) }, 0.5)
} }
// 播放战斗背景音乐,并稍微降低音量
oops.audio.volumeMusic = 0.5;
oops.audio.playerMusicLoop("music/BATTLE");
} }
/** 更新开始按钮的状态显示 */ /** 更新开始按钮的状态显示 */
@@ -396,7 +400,7 @@ export class MissionComp extends CCComp {
const label = phaseNode.getComponent(Label); const label = phaseNode.getComponent(Label);
if (label) { if (label) {
const wave = Math.max(1, this.currentWave || (smc.vmdata && smc.vmdata.mission_data ? smc.vmdata.mission_data.level : 1) || 1); const wave = Math.max(1, this.currentWave || (smc.vmdata && smc.vmdata.mission_data ? smc.vmdata.mission_data.level : 1) || 1);
label.string = `${wave}/15`; label.string = `${wave}`;
} }
// 阶段切换动感表现:只在进入战斗阶段跳动一下,让流程充满心流体验 // 阶段切换动感表现:只在进入战斗阶段跳动一下,让流程充满心流体验
@@ -636,6 +640,8 @@ export class MissionComp extends CCComp {
if (!smc.mission.play) return; if (!smc.mission.play) return;
if (smc.mission.pause) return; if (smc.mission.pause) return;
if (this.currentPhase !== MissionPhase.Prepare) return; if (this.currentPhase !== MissionPhase.Prepare) return;
oops.audio.playEffect("music/button");
this.to_fight(); this.to_fight();
} }

View File

@@ -156,6 +156,9 @@ export class MissionHomeComp extends CCComp {
this.uodate_data() this.uodate_data()
this.hideAllPages() this.hideAllPages()
this.node.active=true this.node.active=true
// 播放主页背景音乐,恢复默认音量
oops.audio.volumeMusic = 1.0;
oops.audio.playerMusicLoop("music/home")
} }
/** 更新主页显示数据(预留) */ /** 更新主页显示数据(预留) */

View File

@@ -35,7 +35,7 @@ import { HeroInfo, HType } from "../common/config/heroSet";
import { smc } from "../common/SingletonModuleComp"; import { smc } from "../common/SingletonModuleComp";
import { GameEvent } from "../common/config/GameEvent"; import { GameEvent } from "../common/config/GameEvent";
import {BoxSet, FacSet } from "../common/config/GameSet"; import {BoxSet, FacSet } from "../common/config/GameSet";
import { spawningEngine, GeneratedMonster, AffixType, MonType, MonList } from "./RogueConfig"; import { spawningEngine, GeneratedMonster, AffixType, MonType, MonList, TestModeConfig } from "./RogueConfig";
import { HeroAttrsComp } from "../hero/HeroAttrsComp"; import { HeroAttrsComp } from "../hero/HeroAttrsComp";
import { MonMoveComp } from "../hero/MonMoveComp"; import { MonMoveComp } from "../hero/MonMoveComp";
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
@@ -195,6 +195,11 @@ export class MissionMonCompComp extends CCComp {
const monsters = spawningEngine.generateWave(this.currentWave); const monsters = spawningEngine.generateWave(this.currentWave);
this.setupWaveData(monsters); this.setupWaveData(monsters);
// 如果处于测试模式,英雄也需要限制为只产出一个,这部分通知可以配合使用
if (TestModeConfig.enable) {
mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] 测试模式已开启每波仅生成1只基准怪物");
}
mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] Starting Wave System"); mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] Starting Wave System");
} }
@@ -306,12 +311,16 @@ export class MissionMonCompComp extends CCComp {
let scale = -1; let scale = -1;
// 获取硬编码的占位点坐标,不再使用随机偏移 // 获取硬编码的占位点坐标,不再使用随机偏移
const basePos = MissionMonCompComp.MON_POSITIONS[posIndex]; const basePos = MissionMonCompComp.MON_POSITIONS[posIndex % MissionMonCompComp.MON_POSITIONS.length];
const spawnX = basePos.x; const spawnX = basePos.x;
const landingY = basePos.y + (monData.isBoss ? 6 : 0); const landingY = basePos.y + (monData.isBoss ? 6 : 0);
const spawnPos: Vec3 = v3(spawnX, landingY + MissionMonCompComp.MON_DROP_HEIGHT, 0); const spawnPos: Vec3 = v3(spawnX, landingY + MissionMonCompComp.MON_DROP_HEIGHT, 0);
this.globalSpawnOrder = (this.globalSpawnOrder + 1) % 999; this.globalSpawnOrder = (this.globalSpawnOrder + 1) % 999;
// 如果存在测试技能覆盖,则传递下去(修改 mon.load 逻辑或者通过预存)
// 为了避免侵入 Mon.ts 的原有逻辑,我们先预存
(mon as any)._testSkills = monData.testSkills;
mon.load(spawnPos, scale, monData.uuid, monData.isBoss, landingY, monLv, posIndex); mon.load(spawnPos, scale, monData.uuid, monData.isBoss, landingY, monLv, posIndex);
// 设置渲染排序 // 设置渲染排序

View File

@@ -278,16 +278,26 @@ const BOSS_TIERS = new Set([1, 2, 3, 4, 5])
const MAJOR_BOSS_TIERS = new Set([3, 5]) const MAJOR_BOSS_TIERS = new Set([3, 5])
/** /**
* 5 阶梯配置表 * 5 阶梯配置表 (基于"第5波单怪=1个英雄"的基准推演)
* key = 阶梯编号 1-5value = 该阶梯的完整配置 *
* 主线 15 波映射wave 1-3 → T1, wave 4-6 → T2, ..., wave 13-15 → T5 * 核心设计推演:
* 1. 玩家反馈Tier 2 (第4-6波) 的单只怪物强度,刚好对应 1 个 Lv1 英雄。
* 2. 设 Tier 2 的 Multiplier 为 2.0,基准近战怪成本为 22。
* 3. 则 1个购卡战力 (1个Lv1英雄) = 22 * 2.0 = 44 难度点。
* 4. 推演公式:当前波次总难度 (Budget * Multiplier) ≈ 累计购卡数 * 44。
* 5. 约束:为避免触发同屏最大 12 只怪的截断机制,后期 Budget 锁定在 260-280难度全靠 Multiplier (属性) 拉升。
*/ */
export const TierConfigs: Record<number, TierConfig> = { export const TierConfigs: Record<number, TierConfig> = {
1: { multiplier: 1.0, budget: 60, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false }, // T1(W1-W3): 预计累计 2.3 卡。目标总难度 101。Budget 80 * 1.1 = 88
2: { multiplier: 1.5, budget: 120, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true }, 1: { multiplier: 1.1, budget: 80, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false },
3: { multiplier: 2.2, budget: 180, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true }, // T2(W4-W6): 预计累计 8.0 卡。目标总难度 352。Budget 160 * 2.0 = 320
4: { multiplier: 3.2, budget: 240, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true }, 2: { multiplier: 2.0, budget: 160, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true },
5: { multiplier: 4.5, budget: 300, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true }, // T3(W7-W9): 预计累计 15.3卡。目标总难度 673。Budget 220 * 3.0 = 660
3: { multiplier: 3.0, budget: 220, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true },
// T4(W10-W12):预计累计 23.3卡。目标总难度 1025。Budget 260 * 4.0 = 1040
4: { multiplier: 4.0, budget: 260, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
// T5(W13-W15):预计累计 31.3卡。目标总难度 1377。Budget 280 * 5.2 = 1456
5: { multiplier: 5.2, budget: 280, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
} }
/** /**
@@ -525,6 +535,42 @@ export const InfiniteModeConfig = {
megaBossInterval: 3, megaBossInterval: 3,
} }
// ======================== 测试模式配置 ========================
/**
* 单挑测试模式配置
* 用于寻找 1v1 环境下单只怪物与单只英雄的战力基准
* 开启后每波只生成 1 只怪物,且其属性随波次平滑递增
*/
export const TestModeConfig = {
/** 是否开启单挑测试模式 */
enable: true,
/** 测试模式中生成怪物的基础生命值 (对应 1级 英雄) */
baseHp: 150,
/** 测试模式中生成怪物的基础攻击力 (对应 1级 英雄) */
baseAp: 12,
/** 每波次基础属性增加比例 (例如 0.2 表示每波增加 20%) */
growthRatePerWave: 0.2,
/** 固定的测试怪物类型 */
monType: MonType.Melee,
/** 固定的测试怪物 UUID (如 6001 兽人战士) */
monUuid: 6001,
/** 测试模式中生成怪物是否携带特定词缀(为空则不带) */
affixes: [] as AffixType[],
/** 每次刷新的怪物数量 */
spawnCount: 1,
// ===== 附加技能测试覆盖配置 =====
/** 替换普攻技能(清除旧技能,添加新技能) */
skill: undefined as { s_uuid: number; cd?: number; overrides?: any } | undefined,
/** 覆盖触发技能(完全替换该类型的触发配置) */
atking: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
atked: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
dead: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
fstart: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
fend: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
}
// ======================== 向后兼容接口 ======================== // ======================== 向后兼容接口 ========================
/** /**
@@ -574,6 +620,15 @@ export interface GeneratedMonster {
affixes: AffixType[] affixes: AffixType[]
isBoss: boolean isBoss: boolean
spawnIndex: number spawnIndex: number
/** 测试模式专属:临时覆盖怪物技能配置 */
testSkills?: {
skill?: { s_uuid: number; cd?: number; overrides?: any };
atking?: { s_uuid: number; t_num: number; overrides?: any }[];
atked?: { s_uuid: number; t_num: number; overrides?: any }[];
dead?: { s_uuid: number; t_num: number; overrides?: any }[];
fstart?: { s_uuid: number; t_num: number; overrides?: any }[];
fend?: { s_uuid: number; t_num: number; overrides?: any }[];
}
} }
// ======================== 生成引擎 ======================== // ======================== 生成引擎 ========================
@@ -635,6 +690,42 @@ export class RogueSpawningEngine {
generateWave(waveNumber: number): GeneratedMonster[] { generateWave(waveNumber: number): GeneratedMonster[] {
if (waveNumber < 1) return [] if (waveNumber < 1) return []
// 测试模式拦截
if (TestModeConfig.enable) {
const growth = 1 + (waveNumber - 1) * TestModeConfig.growthRatePerWave;
// 提取词缀加成
const affixHpMul = 1.0 + TestModeConfig.affixes.reduce(
(sum, a) => sum + (AffixConfigs[a].hpMultiplier - 1.0), 0
);
const affixApMul = 1.0 + TestModeConfig.affixes.reduce(
(sum, a) => sum + (AffixConfigs[a].apMultiplier - 1.0), 0
);
const count = Math.max(1, TestModeConfig.spawnCount || 1);
const monsters: GeneratedMonster[] = [];
for (let i = 0; i < count; i++) {
monsters.push({
uuid: TestModeConfig.monUuid,
type: TestModeConfig.monType,
hp: Math.round(TestModeConfig.baseHp * growth * affixHpMul),
ap: Math.round(TestModeConfig.baseAp * growth * affixApMul),
affixes: [...TestModeConfig.affixes],
isBoss: false,
spawnIndex: i,
testSkills: {
skill: TestModeConfig.skill,
atking: TestModeConfig.atking,
atked: TestModeConfig.atked,
dead: TestModeConfig.dead,
fstart: TestModeConfig.fstart,
fend: TestModeConfig.fend
}
});
}
return monsters;
}
const tier = Math.ceil(waveNumber / 3) const tier = Math.ceil(waveNumber / 3)
const waveInTier = ((waveNumber - 1) % 3) + 1 // 1, 2, or 3 const waveInTier = ((waveNumber - 1) % 3) + 1 // 1, 2, or 3

View File

@@ -117,6 +117,7 @@ export class SkillBoxComp extends CCComp {
private onNodeClicked() { private onNodeClicked() {
if (!this.initialized) return; if (!this.initialized) return;
oops.audio.playEffect("music/button");
// 点击时弹出 HInfoComp传入卡牌 UUID 和等级以启用预览模式 // 点击时弹出 HInfoComp传入卡牌 UUID 和等级以启用预览模式
const config = CardPoolList.find(c => c.uuid === this.s_uuid || c.skill === this.s_uuid); const config = CardPoolList.find(c => c.uuid === this.s_uuid || c.skill === this.s_uuid);
const cardUuid = config ? config.uuid : this.s_uuid; const cardUuid = config ? config.uuid : this.s_uuid;

View File

@@ -206,12 +206,14 @@ export class Skill extends ecs.Entity {
const SUp=SkillUpList[s_uuid] ? SkillUpList[s_uuid]:SkillUpList[1001]; const SUp=SkillUpList[s_uuid] ? SkillUpList[s_uuid]:SkillUpList[1001];
const sCrt = (config.crt ?? 0)+(SUp.crt*skill_lv); const sCrt = (config.crt ?? 0)+(SUp.crt*skill_lv);
const sFrz = (config.frz ?? 0)+(SUp.frz*skill_lv); const sFrz = (config.frz ?? 0)+(SUp.frz*skill_lv);
const sStun = (config.stun ?? 0)+(SUp.stun*skill_lv);
const sAp =config.ap+(SUp.ap*skill_lv); const sAp =config.ap+(SUp.ap*skill_lv);
const sHit=config.hit_count+(SUp.hit_count*skill_lv); const sHit=config.hit_count+(SUp.hit_count*skill_lv);
sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap*sAp/100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100不然会出现ap为90%变0 sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap*sAp/100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100不然会出现ap为90%变0
sDataCom.Attrs[Attrs.critical] = cAttrsComp.getRuntimeCritical() + sCrt; sDataCom.Attrs[Attrs.critical] = cAttrsComp.getRuntimeCritical() + sCrt;
sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getRuntimeCritDamageBonus(); sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getRuntimeCritDamageBonus();
sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getRuntimeFreezeChance() + sFrz; sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getRuntimeFreezeChance() + sFrz;
sDataCom.Attrs[Attrs.stun_chance] = cAttrsComp.getRuntimeStunChance() + sStun;
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance || 0; sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance || 0;
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.knockback_distance || 0; sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.knockback_distance || 0;
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getRuntimePunctureChance(); // 初始化携带施法者的穿透概率 sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getRuntimePunctureChance(); // 初始化携带施法者的穿透概率