30 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
pan
3f73669ba4 feat(rogue模式): 调整前期配置并添加经济推演文档
新增前20波玩家战力与经济推演估算的详细注释文档,下调各Tier的怪物生成倍率与预算数值,调整所有蓝图模板的怪物生成数量上下限,优化前期游戏体验并平滑开局节奏。
2026-06-12 16:00:11 +08:00
pan
cb515ef00a 重构(任务配置): 提取波次金币奖励配置到 FightSet 枚举
将 MissionComp 中原硬编码的波次金币相关常量,迁移至集中定义的 FightSet 枚举中,统一配置管理以提升后续维护便利性。
2026-06-12 14:58:16 +08:00
pan
7f5af4c04a fix(game): 调整卡牌与波次金币奖励配置,修复上限失效
修改卡牌初始金币CardInitCoins从10改为4
调整波次金币奖励的基础值、增长率与上限参数
重命名金币奖励上限变量,修复原有上限未生效的问题并新增总额限制
2026-06-12 14:57:22 +08:00
pan
acec8f6941 refactor(game/config): 替换硬编码费用为集中配置项
新增GameSet.ts中FightSet枚举的REFRESH_COST和BASE_COST常量,替换CardSet.ts和MissionCardComp.ts内的硬编码费用值。
2026-06-12 14:43:27 +08:00
pan
8c056f2e74 修复(mskillbox): 调整MSkillBox预制体布局参数修正UI错位
本次提交修改了MSkillBox预制体中多个UI元素的位置、对齐方式、内容尺寸和锚点等布局属性,解决原有布局错位的显示问题。
2026-06-12 14:42:54 +08:00
pan
963c89a976 refactor(hero-set): 移除冗余的dis配置字段
删除所有近战怪物配置中的dis:360属性,清理冗余配置项,提升配置文件可维护性。
2026-06-12 14:30:18 +08:00
pan
803e273187 fix(hero.move): 修复战斗阶段英雄移动与攻击状态处理
添加战斗阶段移动限制逻辑,仅在非战斗时执行移动相关操作,修正战斗中的攻击状态与动画切换逻辑,避免异常行为。
2026-06-12 14:29:25 +08:00
pan
4026397cfe fix(map): fix guide trigger logic bug
修复了新手引导2关闭后,技能选取无法触发引导3的逻辑漏洞,将引导2的关闭和引导3的开启判断拆分为独立逻辑,确保正确触发后续引导流程。
2026-06-12 11:07:44 +08:00
pan
969cd657f9 重构(guide): 重构新手引导组件并更新引导prefab配置
将原ECS版本的GuideComp重构为原生Cocos Creator组件,移除冗余ECS依赖
优化引导点击与销毁逻辑,改用框架内置UI管理接口移除引导界面
更新guide1至guide4四个引导prefab,启用动画自动播放并调整动画配置
精简组件事件解绑逻辑,移除冗余的hand节点相关处理代码
2026-06-12 10:54:04 +08:00
pan
b178893a17 feat(新手引导): 实现1-4号新手引导的完整流程
新增UIID.Guide1~Guide4枚举及弹窗UI配置
在任务主页组件中添加引导1的触发与完成逻辑
在任务卡牌组件中按流程触发引导2、3、4,完成步骤后自动切换并标记完成
2026-06-12 10:31:15 +08:00
pan
8e7334f1f0 重构(新手引导): 优化新手引导预制体并清理冗余配置
本次更新了guide1、guide2、guide3、guide4四个引导UI预制体,调整了其布局尺寸与对齐组件,同时清理了MSkillBox和role_controller中冗余的旧引导相关配置,提升代码可维护性。
2026-06-12 10:26:06 +08:00
pan
facccf9a6a feat(引导系统): 新增引导预制体并优化引导交互逻辑
新增引导1至引导4四个引导预制体及对应元数据文件
优化GuideComp组件:添加触摸事件监听与销毁解绑逻辑,实现事件穿透以保证底层功能按钮正常响应
调整已完成引导列表的初始值从空数组改为包含0号引导项
更新角色控制器预制体的引导相关配置参数
2026-06-12 10:08:37 +08:00
pan
167c6b485a refactor(新手引导): 调整引导组件交互与UI实现
- 重构触发逻辑,将触摸事件改为按钮点击触发
- 更新引导预制体,添加弹窗与确认按钮UI
- 调整UI配置文件的边框参数适配新布局
- 简化组件事件管理与代码逻辑
2026-06-12 09:23:03 +08:00
pan
531343c0d7 feat(guide): 添加引导手势动画播放功能
新增dianji(点击)、huadong(滑动)两款手势动画资源及元数据文件
扩展GuideComp引导组件:新增CCString导入、动画名称配置属性,实现延迟加载并播放指定动画的逻辑,包含异常日志处理
更新引导预制体:将原hand节点重命名为shouzhi,添加Animation组件并绑定两款动画剪辑,调整默认配置
2026-06-12 08:57:44 +08:00
78 changed files with 11689 additions and 8950 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,17 +1,17 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "buff_wind",
"_name": "stun",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 18,
"sample": 20,
"speed": 1,
"wrapMode": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.5555555555555556,
"_duration": 0.45,
"_hash": 500763545,
"_tracks": [
{
@@ -69,55 +69,50 @@
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.05555555555555555,
0.1111111111111111,
0.16666666666666666,
0.2222222222222222,
0.2777777777777778,
0.3333333333333333,
0.3888888888888889,
0.4444444444444444,
0.5
0.05,
0.1,
0.15,
0.2,
0.25,
0.3,
0.35,
0.4
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@121c9",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1069b",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@32458",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@5e490",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@770ee",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@33f1e",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bad49",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@71255",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c9790",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@4a25e",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@121c9",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@9eaf3",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@32458",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3f6a9",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@770ee",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bf2fe",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bad49",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c9790",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@eab68",
"__expectedType__": "cc.SpriteFrame"
}
]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,13 +1 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "97881732-3eb6-4ca6-b533-69b1df110ef3",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "dead"
}
}
{"ver":"1.1.50","importer":"prefab","imported":true,"uuid":"af18002a-9f2d-4b2a-8b39-e9a1bc61563a","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": []
},
"_native": "",
"sample": 5,
"sample": 1,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 6,
"_duration": 30,
"_hash": 500763545,
"_tracks": [
{
@@ -77,7 +77,7 @@
"__type__": "cc.RealCurve",
"_times": [
0,
6
30
],
"_values": [
{
@@ -90,7 +90,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
},
{
"__type__": "cc.RealKeyframeValue",
@@ -102,7 +104,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
}
],
"preExtrapolation": 1,
@@ -118,7 +122,7 @@
"__type__": "cc.RealCurve",
"_times": [
0,
6
30
],
"_values": [
{
@@ -131,7 +135,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
},
{
"__type__": "cc.RealKeyframeValue",
@@ -143,7 +149,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
}
],
"preExtrapolation": 1,
@@ -159,7 +167,7 @@
"__type__": "cc.RealCurve",
"_times": [
0,
6
30
],
"_values": [
{
@@ -172,7 +180,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
},
{
"__type__": "cc.RealKeyframeValue",
@@ -184,7 +194,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
}
],
"preExtrapolation": 1,
@@ -251,7 +263,7 @@
"__type__": "cc.RealCurve",
"_times": [
0,
6
30
],
"_values": [
{
@@ -264,7 +276,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
},
{
"__type__": "cc.RealKeyframeValue",
@@ -276,7 +290,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
}
],
"preExtrapolation": 1,
@@ -292,7 +308,7 @@
"__type__": "cc.RealCurve",
"_times": [
0,
6
30
],
"_values": [
{
@@ -305,7 +321,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
},
{
"__type__": "cc.RealKeyframeValue",
@@ -317,7 +335,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
}
],
"preExtrapolation": 1,
@@ -333,7 +353,7 @@
"__type__": "cc.RealCurve",
"_times": [
0,
6
30
],
"_values": [
{
@@ -346,7 +366,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
},
{
"__type__": "cc.RealKeyframeValue",
@@ -358,7 +380,9 @@
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
"__editorExtras__": {
"broken": null
}
}
],
"preExtrapolation": 1,

View File

@@ -0,0 +1,258 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "dianji",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 15,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.6666666666666666,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 11
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.VectorTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channels": [
{
"__id__": 3
},
{
"__id__": 5
},
{
"__id__": 7
},
{
"__id__": 9
}
],
"_nComponents": 3
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
"position"
]
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 4
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.3333333333333333,
0.6666666666666666
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 20.685,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.3333333333333333,
0.6666666666666666
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": -58.235,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 8
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.3333333333333333,
0.6666666666666666
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 10
}
},
{
"__type__": "cc.RealCurve",
"_times": [],
"_values": [],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -2,12 +2,12 @@
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "9b809af9-120e-4683-a90a-5fecbd4e1ebd",
"uuid": "70fd0e99-c640-4497-b2c2-936f5179f227",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "start"
"name": "dianji"
}
}

View File

@@ -0,0 +1,258 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "huadong",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 10,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 1,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 11
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.VectorTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channels": [
{
"__id__": 3
},
{
"__id__": 5
},
{
"__id__": 7
},
{
"__id__": 9
}
],
"_nComponents": 3
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
"position"
]
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 4
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.7,
1
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.7,
1
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 213.527,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 8
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.7,
1
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 0,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": {
"tangentMode": 0
}
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 10
}
},
{
"__type__": "cc.RealCurve",
"_times": [],
"_values": [],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -2,12 +2,12 @@
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "67419693-8fea-48df-a2f4-d52e993932c0",
"uuid": "be8b49e0-c726-4c44-823e-d50921b886d3",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "buff_wind"
"name": "huadong"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,394 +0,0 @@
[
{
"__type__": "cc.Prefab",
"_name": "guide",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "guide",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 18
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 640,
"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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "hand",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 1
},
"_children": [
{
"__id__": 3
}
],
"_active": true,
"_components": [
{
"__id__": 9
}
],
"_prefab": {
"__id__": 11
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": -294.238,
"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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "hand",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 2
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 4
},
{
"__id__": 6
}
],
"_prefab": {
"__id__": 8
},
"_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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 3
},
"_enabled": true,
"__prefab": {
"__id__": 5
},
"_contentSize": {
"__type__": "cc.Size",
"width": 98,
"height": 111
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "79Vu4Cv05PnJw1LXaSE4DD"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 3
},
"_enabled": true,
"__prefab": {
"__id__": 7
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "6165ffc9-a838-4a33-b569-bdbaaab0e6b4@5990a",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 1,
"_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": "e4qJ7s1yxD9JrYdfGLFkVo"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c98HTacPpLKZkCGXoKpM4T",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 10
},
"_contentSize": {
"__type__": "cc.Size",
"width": 400,
"height": 140
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "8bH6M7VahGk79zZiTESQBG"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "cbf1XjyLtM3ptfNNcea20y",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"_contentSize": {
"__type__": "cc.Size",
"width": 720,
"height": 1280
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "50NXlbXx9PHYhb8LT2nDRv"
},
{
"__type__": "cc.Widget",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"_alignFlags": 45,
"_target": null,
"_left": 0,
"_right": 0,
"_top": 0,
"_bottom": 0,
"_horizontalCenter": 0,
"_verticalCenter": 0,
"_isAbsLeft": true,
"_isAbsRight": true,
"_isAbsTop": true,
"_isAbsBottom": true,
"_isAbsHorizontalCenter": true,
"_isAbsVerticalCenter": true,
"_originalWidth": 100,
"_originalHeight": 100,
"_alignMode": 2,
"_lockFlags": 0,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "10DsksGxZDUbKjtrjCTMxF"
},
{
"__type__": "25122z/cnRPhp90+CJYs5+r",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"hand": {
"__id__": 2
},
"guide_id": 0,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "1fYnYBrbBNgoLyArRX18hs"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "6dh4o/8p1Cy5An1p6o4Bc3",
"targetOverrides": null
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,6 @@
],
"subMetas": {},
"userData": {
"syncNodeName": "guide"
"syncNodeName": "guide1"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,12 +2,12 @@
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "311c4048-f871-4f0d-a1e6-c1d82aba4a42",
"uuid": "26b4ba5a-c5e4-405a-8ce9-27be21f86171",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "buff_wind"
"syncNodeName": "guide2"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "9864952d-1b4a-4fb8-9e10-05ae52a1befb",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "guide3"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "d2dcd02d-b49b-45ea-8e20-1cc474837da9",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "guide4"
}
}

View File

@@ -38,10 +38,13 @@
"_components": [
{
"__id__": 102
},
{
"__id__": 104
}
],
"_prefab": {
"__id__": 104
"__id__": 106
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -240,7 +243,7 @@
},
{
"__type__": "cc.Node",
"_name": "m7",
"_name": "h",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -618,7 +621,7 @@
},
{
"__type__": "cc.Node",
"_name": "a1",
"_name": "h",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -996,7 +999,7 @@
},
{
"__type__": "cc.Node",
"_name": "k1",
"_name": "h",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -1208,7 +1211,7 @@
},
{
"__type__": "cc.Node",
"_name": "hero2",
"_name": "hero4",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -1374,7 +1377,7 @@
},
{
"__type__": "cc.Node",
"_name": "m1",
"_name": "h",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -1586,7 +1589,7 @@
},
{
"__type__": "cc.Node",
"_name": "hero4",
"_name": "hero5",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -1752,7 +1755,7 @@
},
{
"__type__": "cc.Node",
"_name": "h1",
"_name": "h",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
@@ -1990,6 +1993,39 @@
"__type__": "cc.CompPrefabInfo",
"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",
"root": {

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -22,26 +22,26 @@
"__id__": 2
},
{
"__id__": 445
"__id__": 423
},
{
"__id__": 454
"__id__": 432
}
],
"_active": true,
"_components": [
{
"__id__": 467
"__id__": 445
},
{
"__id__": 469
"__id__": 447
},
{
"__id__": 471
"__id__": 449
}
],
"_prefab": {
"__id__": 473
"__id__": 451
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -92,25 +92,22 @@
},
{
"__id__": 73
},
{
"__id__": 416
}
],
"_active": true,
"_components": [
{
"__id__": 438
"__id__": 416
},
{
"__id__": 440
"__id__": 418
},
{
"__id__": 442
"__id__": 420
}
],
"_prefab": {
"__id__": 444
"__id__": 422
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1389,7 +1386,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -180,
"x": -240,
"y": 0,
"z": 0
},
@@ -1788,7 +1785,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -2390,7 +2387,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -2913,7 +2910,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -3512,7 +3509,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -4767,7 +4764,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 180,
"x": 240,
"y": 0,
"z": 0
},
@@ -5166,7 +5163,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -5768,7 +5765,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -9320,7 +9317,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 540,
"width": 720,
"height": 200
},
"_anchorPoint": {
@@ -9348,8 +9345,8 @@
},
"_alignFlags": 44,
"_target": null,
"_left": 90,
"_right": 90,
"_left": 0,
"_right": 0,
"_top": 0,
"_bottom": -2,
"_horizontalCenter": 0,
@@ -9422,421 +9419,17 @@
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.Node",
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"_parent": {
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_prefab": {
"_enabled": true,
"__prefab": {
"__id__": 417
},
"__editorExtras__": {}
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 416
},
"asset": {
"__uuid__": "93fda804-b794-4119-a287-952a70be15cb",
"__expectedType__": "cc.Prefab"
},
"fileId": "6dh4o/8p1Cy5An1p6o4Bc3",
"instance": {
"__id__": 418
},
"targetOverrides": null
},
{
"__type__": "cc.PrefabInstance",
"fileId": "5aJhr6IKBCvr1yjzfuMlha",
"prefabRootNode": {
"__id__": 1
},
"mountedChildren": [],
"mountedComponents": [
{
"__id__": 419
}
],
"propertyOverrides": [
{
"__id__": 433
},
{
"__id__": 435
},
{
"__id__": 436
},
{
"__id__": 437
}
],
"removedComponents": []
},
{
"__type__": "cc.MountedComponentsInfo",
"targetInfo": {
"__id__": 420
},
"components": [
{
"__id__": 421
}
]
},
{
"__type__": "cc.TargetInfo",
"localID": [
"cbf1XjyLtM3ptfNNcea20y"
]
},
{
"__type__": "cc.Widget",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {
"mountedRoot": {
"__id__": 416
}
},
"node": {
"__id__": 422
},
"_enabled": true,
"__prefab": {
"__id__": 432
},
"_alignFlags": 44,
"_target": null,
"_left": 160,
"_right": 160,
"_top": 0,
"_bottom": 275.762,
"_horizontalCenter": 0,
"_verticalCenter": 0,
"_isAbsLeft": true,
"_isAbsRight": true,
"_isAbsTop": true,
"_isAbsBottom": true,
"_isAbsHorizontalCenter": true,
"_isAbsVerticalCenter": true,
"_originalWidth": 400,
"_originalHeight": 0,
"_alignMode": 2,
"_lockFlags": 0,
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "hand",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 416
},
"_children": [
{
"__id__": 423
}
],
"_active": true,
"_components": [
{
"__id__": 429
},
{
"__id__": 421
}
],
"_prefab": {
"__id__": 431
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": -294.238,
"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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "hand",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 422
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 424
},
{
"__id__": 426
}
],
"_prefab": {
"__id__": 428
},
"_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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 423
},
"_enabled": true,
"__prefab": {
"__id__": 425
},
"_contentSize": {
"__type__": "cc.Size",
"width": 98,
"height": 111
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "79Vu4Cv05PnJw1LXaSE4DD"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 423
},
"_enabled": true,
"__prefab": {
"__id__": 427
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "6165ffc9-a838-4a33-b569-bdbaaab0e6b4@5990a",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 1,
"_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": "e4qJ7s1yxD9JrYdfGLFkVo"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c98HTacPpLKZkCGXoKpM4T",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 422
},
"_enabled": true,
"__prefab": {
"__id__": 430
},
"_contentSize": {
"__type__": "cc.Size",
"width": 400,
"height": 140
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "8bH6M7VahGk79zZiTESQBG"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "cbf1XjyLtM3ptfNNcea20y",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "6b+8SFUXpKIYA8Q2ep3HVS"
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 434
},
"propertyPath": [
"_name"
],
"value": "guide"
},
{
"__type__": "cc.TargetInfo",
"localID": [
"6dh4o/8p1Cy5An1p6o4Bc3"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 434
},
"propertyPath": [
"_lpos"
],
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 640,
"z": 0
}
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 434
},
"propertyPath": [
"_lrot"
],
"value": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
}
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 434
},
"propertyPath": [
"_euler"
],
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
}
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 439
},
"_contentSize": {
"__type__": "cc.Size",
"width": 720,
@@ -9863,7 +9456,7 @@
},
"_enabled": true,
"__prefab": {
"__id__": 441
"__id__": 419
},
"_alignFlags": 21,
"_target": null,
@@ -9899,7 +9492,7 @@
},
"_enabled": true,
"__prefab": {
"__id__": 443
"__id__": 421
},
"home_btn": {
"__id__": 121
@@ -9948,14 +9541,14 @@
"__id__": 1
},
"_prefab": {
"__id__": 446
"__id__": 424
},
"__editorExtras__": {}
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 445
"__id__": 423
},
"asset": {
"__uuid__": "26bff847-cd29-48a5-bbfa-c3e2dbda688d",
@@ -9963,7 +9556,7 @@
},
"fileId": "5a9CMsVQhKP5Y+UJfTKPbx",
"instance": {
"__id__": 447
"__id__": 425
},
"targetOverrides": null
},
@@ -9977,19 +9570,19 @@
"mountedComponents": [],
"propertyOverrides": [
{
"__id__": 448
"__id__": 426
},
{
"__id__": 450
"__id__": 428
},
{
"__id__": 451
"__id__": 429
},
{
"__id__": 452
"__id__": 430
},
{
"__id__": 453
"__id__": 431
}
],
"removedComponents": []
@@ -9997,7 +9590,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 449
"__id__": 427
},
"propertyPath": [
"_name"
@@ -10013,7 +9606,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 449
"__id__": 427
},
"propertyPath": [
"_lpos"
@@ -10028,7 +9621,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 449
"__id__": 427
},
"propertyPath": [
"_lrot"
@@ -10044,7 +9637,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 449
"__id__": 427
},
"propertyPath": [
"_euler"
@@ -10059,7 +9652,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 449
"__id__": 427
},
"propertyPath": [
"_active"
@@ -10073,14 +9666,14 @@
"__id__": 1
},
"_prefab": {
"__id__": 455
"__id__": 433
},
"__editorExtras__": {}
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 454
"__id__": 432
},
"asset": {
"__uuid__": "56aee962-4a5e-45ae-a779-999444d06d18",
@@ -10088,7 +9681,7 @@
},
"fileId": "cboM54s0hM07XCtrpFp0/b",
"instance": {
"__id__": 456
"__id__": 434
},
"targetOverrides": null
},
@@ -10102,28 +9695,28 @@
"mountedComponents": [],
"propertyOverrides": [
{
"__id__": 457
"__id__": 435
},
{
"__id__": 459
"__id__": 437
},
{
"__id__": 460
"__id__": 438
},
{
"__id__": 461
"__id__": 439
},
{
"__id__": 462
"__id__": 440
},
{
"__id__": 464
"__id__": 442
},
{
"__id__": 465
"__id__": 443
},
{
"__id__": 466
"__id__": 444
}
],
"removedComponents": []
@@ -10131,7 +9724,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 458
"__id__": 436
},
"propertyPath": [
"_name"
@@ -10147,7 +9740,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 458
"__id__": 436
},
"propertyPath": [
"_lpos"
@@ -10162,7 +9755,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 458
"__id__": 436
},
"propertyPath": [
"_lrot"
@@ -10178,7 +9771,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 458
"__id__": 436
},
"propertyPath": [
"_euler"
@@ -10193,7 +9786,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 463
"__id__": 441
},
"propertyPath": [
"_top"
@@ -10209,7 +9802,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 463
"__id__": 441
},
"propertyPath": [
"_alignFlags"
@@ -10219,7 +9812,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 463
"__id__": 441
},
"propertyPath": [
"_bottom"
@@ -10229,7 +9822,7 @@
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 458
"__id__": 436
},
"propertyPath": [
"_active"
@@ -10246,7 +9839,7 @@
},
"_enabled": true,
"__prefab": {
"__id__": 468
"__id__": 446
},
"_contentSize": {
"__type__": "cc.Size",
@@ -10274,7 +9867,7 @@
},
"_enabled": true,
"__prefab": {
"__id__": 470
"__id__": 448
},
"_alignFlags": 45,
"_target": null,
@@ -10310,7 +9903,7 @@
},
"_enabled": true,
"__prefab": {
"__id__": 472
"__id__": 450
},
"debugMode": false,
"_id": ""
@@ -10329,16 +9922,13 @@
},
"fileId": "6514ysgfJNtIx/ak03+nce",
"instance": null,
"targetOverrides": null,
"targetOverrides": [],
"nestedPrefabInstanceRoots": [
{
"__id__": 454
"__id__": 432
},
{
"__id__": 445
},
{
"__id__": 416
"__id__": 423
},
{
"__id__": 55

View File

@@ -9960,8 +9960,8 @@
"height": 539,
"rawWidth": 480,
"rawHeight": 539,
"borderTop": 72,
"borderBottom": 346,
"borderTop": 36,
"borderBottom": 296,
"borderLeft": 38,
"borderRight": 30,
"packable": true,

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 {
gold: number,
switch_effect?: boolean, // 音效开关
switch_music?: boolean, // 音乐开关
timestamp?: number, // 用于比对本地与云端数据的最新状态
}
export interface CloudData {
@@ -44,7 +46,7 @@ export class SingletonModuleComp extends ecs.Comp {
in_fight: false,
stop_mon_action: false,
};
finish_guides: number[] = []
finish_guides: number[] = [0]
data: any = {
score: 0,
mission: 1,
@@ -129,6 +131,8 @@ export class SingletonModuleComp extends ecs.Comp {
} as GameScoreStats,
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) {
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更新
@@ -231,6 +245,8 @@ export class SingletonModuleComp extends ecs.Comp {
getGameDate() {
let data: GameDate = {
gold: this.vmdata.gold,
switch_effect: this.vmdata.switch_effect,
switch_music: this.vmdata.switch_music,
timestamp: Date.now() // 每次获取当前数据结构时都附带最新的时间戳
};
return data;
@@ -245,6 +261,22 @@ export class SingletonModuleComp extends ecs.Comp {
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

@@ -77,7 +77,7 @@ export const CardsUpSet: Record<number, number> = {
}
/**初始coin数 */
export const CardInitCoins = 10
export const CardInitCoins = 4
/** 卡池升级每波减免金额 */
export const CARD_POOL_UPGRADE_DISCOUNT_PER_WAVE = 10
/** 卡池默认初始等级 */
@@ -97,7 +97,7 @@ HeroList.forEach(uuid => {
const basePoolLv = hero.pool_lv || 1;
const baseHeroLv = hero.lv || 1;
const baseCost = 5;
const baseCost = FightSet.BASE_COST;
const baseWeight = 25;
// 生成从 basePoolLv 到 CARD_POOL_MAX_LEVEL 的卡牌

View File

@@ -21,6 +21,9 @@ export enum FacSet {
MON = 1,
}
export enum FightSet {
WAVE_COIN_BASE = 4, // 波次金币基础奖励
WAVE_COIN_GROW = 1, // 波次金币递增值
WAVE_COIN_MAX = 10, // 波次金币最大基础奖励
CRIT_DAMAGE = 50,//暴击伤害
MORE_RC = 10,//更多次数 广告获取的次数
HEARTPOS = -320,//基地位置
@@ -32,12 +35,16 @@ export enum FightSet {
FiIGHT_TIME = 30,//战斗时间
// BACK_CHANCE=40,//击退概率
FROST_TIME = 3,//冰冻时间
STUN_TIME = 2,//击晕时间
SKILL_CAST_DELAY = 0.15,
CSKILL_START_X = -340,
CSKILL_START_Y = 30,
SHIELD_MAX = 5,
WAVE_HEAL_RATE = 0.5, // 回合结束时所有英雄恢复最大生命值的比例
PUNCTURE_DOWN = 50,
REFRESH_COST = 1,
BASE_COST=3
// 刷新成本
}
export const laneIdx = {

View File

@@ -24,6 +24,10 @@ export enum UIID {
HInfo,
/** 技能卡牌系统核心控制器 */
SkillBox,
Guide1,
Guide2,
Guide3,
Guide4,
}
/** 打开界面方式的配置数据 */
@@ -40,4 +44,8 @@ export var UIConfigData: { [key: number]: UIConfig } = {
[UIID.Mission]: { layer: LayerType.UI, prefab: "gui/element/mission" },
[UIID.HInfo]: { layer: LayerType.UI, prefab: "gui/element/hnode" },
[UIID.SkillBox]: { layer: LayerType.UI, prefab: "gui/element/skillbox" },
[UIID.Guide1]: { layer: LayerType.PopUp, prefab: "gui/element/guide1" },
[UIID.Guide2]: { layer: LayerType.PopUp, prefab: "gui/element/guide2" },
[UIID.Guide3]: { layer: LayerType.PopUp, prefab: "gui/element/guide3" },
[UIID.Guide4]: { layer: LayerType.PopUp, prefab: "gui/element/guide4" },
}

View File

@@ -29,6 +29,8 @@ export enum Attrs {
// ==================== 特殊效果属性 ====================
freeze_chance = "freeze_chance", // 冰冻概率
freeze_res = "freeze_res", // 冰冻抗性
stun_chance = "stun_chance", // 击晕概率
stun_res = "stun_res", // 击晕抗性
knockback_chance = "knockback_chance", // 击退概率
knockback_distance = "knockback_distance", // 击退距离强化
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.frz) parts.push(`冰冻+${skill.frz}%`);
if (skill.stun) parts.push(`击晕+${skill.stun}%`);
// 附加击退概率
if (skill.bck) parts.push(`击退+${skill.bck}%`);
}
@@ -109,7 +110,7 @@ export function buildSkillDesc(hero: heroInfo): string {
// 通过 s_uuid 查找技能基础配置
const base = SkillSet[item.s_uuid];
if (!base) continue;
// 合并 overrides 得到实际技能参数ap/hit_count/crt/frz/bck 等可能被覆盖)
// 合并 overrides 得到实际技能参数ap/hit_count/crt/frz/stun/bck 等可能被覆盖)
const skill = mergeSkillParams(base, item.overrides);
// 将模板中的 "n" 替换为实际触发次数
const trigger = tpl.replace("n", String(item.t_num));

View File

@@ -150,6 +150,7 @@ export interface SkillConfig {
kind?: SkillKind, // 主效果类型
crt?: number, // 额外暴击率
frz?: number, // 额外冰冻概率
stun?: number, // 额外击晕概率
bck?: number, // 额外击退概率
buff_type?: Attrs, // Buff 类型 (单一职责)
call_hero?: number, // 召唤技能召唤英雄id(可选)
@@ -164,8 +165,10 @@ export interface SkillOverrides {
hitcd?: number;
crt?: number;
frz?: number;
stun?: number;
bck?: number;
buff_type?: Attrs;
call_hero?: number;
}
/**
@@ -183,13 +186,13 @@ export function mergeSkillParams(config: SkillConfig, overrides?: SkillOverrides
}
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: {
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,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标",
RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
},
//怪物战士类型统一使用 6005
6005: {
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,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标",
RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
},
6006: {
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,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标",
RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
},
6007: {
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: {
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%的伤害,一定几率暴击,高阶技能",
},
6102: {
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,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,一定几率击退目标,高阶技能",
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,高阶技能",
},
//怪物法师统一使用 暗影球
6103: {
@@ -269,14 +272,14 @@ export const SkillSet: Record<number, SkillConfig> = {
RType: RType.linear, EType: EType.collision, info: "射出强力箭矢最多穿透6个敌人附带20%额外暴击率",
},
6105: {
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,
RType: RType.fixedEnd, EType: EType.animationEnd, info: "召唤冰刺攻击一排的敌人,有概率冰冻",
uuid: 6105, name: "雷爆", sp_name: "ice_up", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max",
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: "召唤雷爆攻击一排的敌人,有概率击晕",
},
6106: {
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,
RType: RType.fixed, EType: EType.animationEnd, info: "召唤墙阻挡敌人,有概率冰冻,100%击退",
uuid: 6106, name: "雷墙", sp_name: "ice_t", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max",
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: "召唤墙阻挡敌人,有概率击晕",
},
6107: {
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次",
},
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,
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: {
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,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.knockback_chance, info: "全体友方击退概率提升10%持续1次",
RType: RType.fixed, EType: EType.animationEnd, info: "暂未使用",
},
6407: {
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,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.knockback_distance, info: "全体友方击退距离提升20点持续1次",
RType: RType.fixed, EType: EType.animationEnd, info: "暂未使用",
},
6408: {
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, // 卖出英雄金币提升
WaveHeal = 7, // 战斗结束生命回复量提升
HeroAtk = 8, // 英雄攻击力加成
HeroFrost = 9, // 英雄冰冻加成
HeroStun = 9, // 英雄击晕加成
HeroCrit = 10, // 英雄暴击加成
HeroCritDamage = 11, // 英雄暴击伤害加成
HeroSpeed = 12, // 英雄攻击速度加成
@@ -393,7 +396,7 @@ export const FieldSkillSet: Record<number, FieldSkillConfig> = {
7006: { uuid: 7006, name: "出售强化", type: FieldSkillType.SellGold, value: 5, info: "卖出英雄金币+5" },
7007: { uuid: 7007, name: "战后恢复", type: FieldSkillType.WaveHeal, value: 0.3, info: "战斗结束生命回复量+30%" },
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%" },
7011: { uuid: 7011, name: "暴伤加成", type: FieldSkillType.HeroCritDamage, value: 0.5, info: "英雄暴击伤害+50%" },
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次攻击为全队叠加攻击力"},
// ========== 冰冻控制流 (新加) ==========
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,
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow1].cd,ccd:0}},
field:[6405],
atking:[{s_uuid:6405,t_num:2}],
evolve:{
2:{atking:[{s_uuid:6105,t_num:3,overrides:{ap:100,frz:20}}]},
3:{skill:{s_uuid:6105,overrides:{frz:15,hit_count:6}},
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,frz:35,hit_count:8}}],
2:{atking:[{s_uuid:6105,t_num:3,overrides:{ap:100,stun:20}}]},
3:{skill:{s_uuid:6105,overrides:{stun:15,hit_count:6}},
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,stun:35,hit_count:8}}],
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,
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Normal3].cd,ccd:0}},
field:[6405],
atking:[{s_uuid:6105,t_num:2,overrides:{ap:120,frz:25}}],
info:"驻场冰冻光环每2次攻击触发冰刺AOE25%冰冻概率住一排敌人"},
atking:[{s_uuid:6105,t_num:2,overrides:{ap:120,stun:25}}],
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,
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow3].cd,ccd:0}},
field:[6405],
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,frz:35,hit_count:8}}],
info:"驻场强力冰冻光环,每次攻击释放冰刺35%冰冻概率"},
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,stun:35,hit_count:8}}],
info:"驻场强力击晕光环,每次攻击释放雷爆35%击晕概率"},
// ========== 辅助英雄 (保留 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,
hp:140,ap:45,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast3].cd,ccd:0}},
atking:[{s_uuid:6406,t_num:2}],
info:"快速射击每2次攻击为全队叠加击退概率"},
atking:[{s_uuid:6408,t_num:2}],
info:"快速射击每2次攻击为全队叠加穿透概率"},
5210:{uuid:5210,name:"龙卷猎手",path:"ha3", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long,
hp:170,ap:70,
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}}],
info:"每2次攻击释放龙卷风30%击退概率推开一排敌人"},
atking:[{s_uuid:6102,t_num:2,overrides:{hit_count:3}}],
info:"每2次攻击释放龙卷风攻击一排敌人"},
5404:{uuid:5404,name:"风暴刺客",path:"hc2", fac:FacSet.HERO,pool_lv:4,lv:1,type:HType.Melee,
hp:250,ap:100,
skills:{6001:{uuid:6001,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast2].cd,ccd:0}},
atking:[
{s_uuid:6407,t_num:1},
{s_uuid:6102,t_num:3,overrides:{bck:50,hit_count:5,ap:120}}
{s_uuid:6409,t_num:1},
{s_uuid:6102,t_num:3,overrides:{hit_count:5,ap:120}}
],
dead:[{s_uuid:6406,t_num:1}],
info:"极速近战,每次攻击给全队加击退距离每3次攻击释放龙卷风死后全队永久击退率加成"},
dead:[{s_uuid:6408,t_num:1}],
info:"极速近战,每次攻击给全队加风怒次数每3次攻击释放龙卷风死后全队永久穿透率加成"},
// ========== 暴击爆发流 ==========
5211:{uuid:5211,name:"猎鹰射手",path:"ha4", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long,
@@ -451,11 +451,11 @@ export const HeroInfo: Record<number, heroInfo> = {
// 基础怪物 (全部远程攻击HType仅决定站位)
// 近战位怪物 (站在前排,承受更多伤害) — v5: TD节奏CD多而弱爽感设计
6001:{uuid:6001,name:"兽人战士",path:"m1", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:220,ap:10,speed:70,
6001:{uuid:6001,name:"兽人战士",path:"m1", fac:FacSet.MON,lv:1,type:HType.Melee,hp:220,ap:10,speed:70,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"基础近战位怪"},
6002:{uuid:6002,name:"兽人精锐战士",path:"m2", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:300,ap:14,speed:110,
6002:{uuid:6002,name:"兽人精锐战士",path:"m2", fac:FacSet.MON,lv:1,type:HType.Melee,hp:300,ap:14,speed:110,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"进阶近战位怪,更快更痛"},
6003:{uuid:6003,name:"兽人重装兵",path:"m3", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:850,ap:20,speed:50,
6003:{uuid:6003,name:"兽人重装兵",path:"m3", fac:FacSet.MON,lv:1,type:HType.Melee,hp:850,ap:20,speed:50,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"重型坦克怪高HP慢攻"},
// 远程位怪物 (站在后排,输出更高)
6004:{uuid:6004,name:"兽人射手",path:"m4", fac:FacSet.MON,lv:1,type:HType.Long,hp:190,ap:35,speed:70,
@@ -463,25 +463,25 @@ export const HeroInfo: Record<number, heroInfo> = {
6005:{uuid:6005,name:"兽人刺客",path:"m5", fac:FacSet.MON,lv:1,type:HType.Long,hp:210,ap:38,speed:130,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"高AP快速攻击刺客"},
// 特殊位怪物
6006:{uuid:6006,name:"骷髅领主",path:"m6", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:5000,ap:20,speed:60,
6006:{uuid:6006,name:"骷髅领主",path:"m6", fac:FacSet.MON,lv:1,type:HType.Melee,hp:5000,ap:20,speed:60,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"MiniBoss级坦克"},
6007:{uuid:6007,name:"兽人术士",path:"m7", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:300,ap:24,speed:70,
6007:{uuid:6007,name:"兽人术士",path:"m7", fac:FacSet.MON,lv:1,type:HType.Melee,hp:300,ap:24,speed:70,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"法师怪,远程魔法攻击"},
6008:{uuid:6008,name:"兽人火法",path:"m8", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:270,ap:32,speed:70,
6008:{uuid:6008,name:"兽人火法",path:"m8", fac:FacSet.MON,lv:1,type:HType.Melee,hp:270,ap:32,speed:70,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"高输出法师怪"},
// BOSS怪物 — Boss节奏1.2-1.5s删除不存在的6206技能
6101:{uuid:6101,name:"兽人首领-双刀战士",path:"mb1", fac:FacSet.MON,lv:6,type:HType.Long,hp:1900,ap:30,speed:120,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"远程Boss高攻速"},
6102:{uuid:6102,name:"兽人首领-斧头战士",path:"mb2", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:7500,ap:26,speed:60,
6102:{uuid:6102,name:"兽人首领-斧头战士",path:"mb2", fac:FacSet.MON,lv:6,type:HType.Melee,hp:7500,ap:26,speed:60,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"近战Boss超高HP"},
6103:{uuid:6103,name:"兽人首领-魔法师",path:"mb3", fac:FacSet.MON,lv:6,type:HType.Long,hp:2250,ap:38,speed:110,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"远程法系Boss高AP"},
6104:{uuid:6104,name:"兽人首领-射手",path:"mb4", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:6800,ap:30,speed:70,
6104:{uuid:6104,name:"兽人首领-射手",path:"mb4", fac:FacSet.MON,lv:6,type:HType.Melee,hp:6800,ap:30,speed:70,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"近战位Boss均衡型"},
6105:{uuid:6105,name:"亡灵首领-法师",path:"mb5", fac:FacSet.MON,lv:6,type:HType.Long,hp:2600,ap:42,speed:110,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"远程高AP Boss"},
6106:{uuid:6106,name:"亡灵首领-骑马战士",path:"mb6", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:9000,ap:26,speed:130,
6106:{uuid:6106,name:"亡灵首领-骑马战士",path:"mb6", fac:FacSet.MON,lv:6,type:HType.Melee,hp:9000,ap:26,speed:130,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"终极Boss最高HP+高速"},
@@ -496,7 +496,7 @@ export const HeroList: number[] = [
5101, 5106, 5107, 5108,
// 治疗续航流
5301, 5302, 5303, 5304, 5305,
// 击退推拉
// 穿刺风怒
5209, 5210, 5404,
// 暴击爆发流
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 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 isKnockback = this.checkChance(knockbackChance);
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击退)
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击晕、击退)
if (targetView) {
targetView.do_atked(damage, isCrit, damageEvent.s_uuid, false);
targetView.playEnd(skillConf.endAnm);
if (isFrost) {
TAttrsComp.toFrost();
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) {
targetView.back(damageEvent.Attrs[Attrs.knockback_distance] || 0);

View File

@@ -49,6 +49,8 @@ export class HeroAttrsComp extends ecs.Comp {
critical_res: number = 0; // 暴击抗性
freeze_chance: number = 0; // 冰冻概率
freeze_res: number = 0; // 冰冻抗性
stun_chance: number = 0; // 击晕概率
stun_res: number = 0; // 击晕抗性
knockback_chance: number = 0; // 击退概率
knockback_distance: number = 0; // 击退距离强化
knockback_res: number = 0; // 击退抗性
@@ -61,6 +63,7 @@ export class HeroAttrsComp extends ecs.Comp {
frost_end_time: number = 0;
stun_end_time: number = 0;
boom: boolean = false; // 自爆怪
@@ -100,6 +103,7 @@ export class HeroAttrsComp extends ecs.Comp {
*/
initAttrs() {
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;
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){
// 如果处于冰冻状态,则技能 CD 暂停刷新
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) {
const skill = this.skills[key];
if (!skill) continue;
@@ -185,6 +213,9 @@ export class HeroAttrsComp extends ecs.Comp {
isFrost(): boolean {
return this.frost_end_time > 0
}
isStun(): boolean {
return this.stun_end_time > 0
}
getSkillLevel(skillId: number): number {
if (!skillId) return 0;
return this.skills[skillId]?.lv ?? 0;
@@ -242,7 +273,13 @@ export class HeroAttrsComp extends ecs.Comp {
/** 英雄实时冰冻率 = 基础冰冻率 + 驻场冰冻率。 */
public getRuntimeFreezeChance(): number {
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.freeze_chance = 0;
this.freeze_res = 0;
this.stun_chance = 0;
this.stun_res = 0;
this.knockback_chance = 0;
this.knockback_distance = 0;
this.knockback_res = 0;
@@ -363,6 +402,7 @@ export class HeroAttrsComp extends ecs.Comp {
this.boom = false;
this.frost_end_time = 0;
this.stun_end_time = 0;
// 重置技能距离缓存
this.maxSkillDistance = 0;
@@ -406,7 +446,12 @@ export class HeroBuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
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;
}

View File

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

View File

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

View File

@@ -194,6 +194,29 @@ export class Monster extends ecs.Entity {
// 最终技能等级 = 初始技能等级 + 怪物等级增量,且下限为 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();

View File

@@ -125,17 +125,22 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
move.baseY = slot.targetY;
move.targetX = slot.targetX;
// 战斗阶段不移动
const canMove = !smc.mission.in_fight;
// 2. 平滑 Y 轴换路
let isChangingLane = false;
if (Math.abs(view.node.position.y - move.baseY) > 2) {
const currentY = view.node.position.y;
const deltaY = move.baseY - currentY;
const step = 400 * this.dt; // 换路速度
const newY = currentY + Math.sign(deltaY) * Math.min(Math.abs(deltaY), step);
view.node.setPosition(view.node.position.x, newY, 0);
isChangingLane = true;
} else {
view.node.setPosition(view.node.position.x, move.baseY, 0);
if (canMove) {
if (Math.abs(view.node.position.y - move.baseY) > 2) {
const currentY = view.node.position.y;
const deltaY = move.baseY - currentY;
const step = 400 * this.dt; // 换路速度
const newY = currentY + Math.sign(deltaY) * Math.min(Math.abs(deltaY), step);
view.node.setPosition(view.node.position.x, newY, 0);
isChangingLane = true;
} else {
view.node.setPosition(view.node.position.x, move.baseY, 0);
}
}
// 渲染层级重排
@@ -144,18 +149,31 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
const nearestEnemy = this.findNearestEnemy(e);
if (nearestEnemy) {
/** 有敌人:进入战斗位移逻辑 */
this.processCombatLogic(e, move, view, model, nearestEnemy);
if (canMove) {
this.processCombatLogic(e, move, view, model, nearestEnemy);
} else {
model.is_atking = true; // 战斗中不移动,但保持攻击状态
}
this.syncCombatTarget(model, view, nearestEnemy);
} else {
/** 无敌人:清目标并回归编队站位 */
this.clearCombatTarget(model);
this.moveToSlot(view, move, model, move.targetX);
if (canMove) {
this.moveToSlot(view, move, model, move.targetX);
}
model.is_atking = false;
}
// 如果只在 Y 轴移动,也要播放 move 动画
if (isChangingLane && view.status !== "move" && view.status !== "atk") {
view.status_change("move");
if (canMove) {
// 如果只在 Y 轴移动,也要播放 move 动画
if (isChangingLane && view.status !== "move" && view.status !== "atk") {
view.status_change("move");
}
} else {
// 战斗阶段如果不移动,确保不在攻击时恢复 idle 状态
if (!model.is_atking && view.status === "move") {
view.status_change("idle");
}
}
}

View File

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

View File

@@ -4,7 +4,7 @@
* @LastEditors: dgflash
* @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 { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
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; // 是否启用调试模式
protected init() {
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);
// 加载多语言包

View File

@@ -1,46 +1,27 @@
import { mLogger } from "../common/Logger";
import { _decorator, Animation, AnimationClip, EventTouch, Label, Node, NodeEventType, Sprite, SpriteAtlas, Tween, tween, UIOpacity, Vec3, resources, Light, UITransform, Widget, CCInteger } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { _decorator, Animation, AnimationClip, EventTouch, Label, Node, NodeEventType, Sprite, SpriteAtlas, Tween, tween, UIOpacity, Vec3, resources, Light, UITransform, Widget, CCInteger, CCString, Component } from "cc";
import { smc } from "../common/SingletonModuleComp";
import { UIID } from "../common/config/GameUIConfig";
import { oops } from "db://oops-framework/core/Oops";
const { ccclass, property } = _decorator;
@ccclass('GuideComp')
@ecs.register('GuideComp', false)
export class GuideComp extends CCComp {
export class GuideComp extends Component {
/** 是否开启调试日志 */
private debugMode: boolean = true;
// ======================== 编辑器绑定节点 ========================
/** 手势图标节点 */
@property(Node)
hand: Node = null!
/** 引导编号 ID */
@property({ type: CCInteger })
guide_id: number = 0
onLoad() {
// 如果该引导已经完成,则隐藏并销毁本节点
if (smc.finish_guides.includes(this.guide_id)) {
this.node.active = false;
this.node.destroy();
return;
}
// 监听手势节点点击事件
if (this.hand) {
this.hand.on(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.hand.on(NodeEventType.TOUCH_END, this.onGuideClick, this);
} else {
// 兜底:如果没有绑定手势节点,则监听自身节点
this.node.on(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.node.on(NodeEventType.TOUCH_END, this.onGuideClick, this);
}
// 监听自身节点(即弹窗任意位置)的点击事件
this.node.on(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.node.on(NodeEventType.TOUCH_END, this.onGuideClick, this);
}
private onTouchStart(event: EventTouch) {
@@ -61,17 +42,25 @@ export class GuideComp extends CCComp {
// 允许事件穿透,确保底层的实际功能按钮能正常接收到点击事件
event.preventSwallow = true;
// 完成后隐藏并销毁引导节点
this.node.active = false;
this.node.destroy();
// 因为通过 oops.gui.open(UIID) 弹出的界面根节点可能会带有一个阻挡点击的遮罩组件BlockInputEvents
// 所以应当通过 oops.gui.remove 彻底从框架的层级管理中移除当前界面。
let targetUIID = -1;
if (this.guide_id === 1) targetUIID = UIID.Guide1;
if (this.guide_id === 2) targetUIID = UIID.Guide2;
if (this.guide_id === 3) targetUIID = UIID.Guide3;
if (this.guide_id === 4) targetUIID = UIID.Guide4;
if (targetUIID !== -1) {
oops.gui.remove(targetUIID);
} else {
// 兜底方案
this.node.active = false;
this.node.destroy();
}
}
/** 组件销毁时解绑所有事件,防止残留回调 */
onDestroy() {
if (this.hand && this.hand.isValid) {
this.hand.off(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.hand.off(NodeEventType.TOUCH_END, this.onGuideClick, this);
}
if (this.node && this.node.isValid) {
this.node.off(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.node.off(NodeEventType.TOUCH_END, this.onGuideClick, this);
@@ -82,11 +71,4 @@ export class GuideComp extends CCComp {
init() {
}
/** ECS 组件移除时的释放钩子:销毁节点 */
reset() {
if (this.node && this.node.isValid) {
this.node.destroy();
}
}
}

View File

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

@@ -49,6 +49,7 @@ import { FacSet, FightSet } from "../common/config/GameSet";
import { MoveComp } from "../hero/MoveComp";
import { MissionHeroComp } from "./MissionHeroComp";
import { MissionEconomy } from "./MissionEconomy";
import { UIID } from "../common/config/GameUIConfig";
const { ccclass, property } = _decorator;
@@ -73,7 +74,7 @@ export class MissionCardComp extends CCComp {
/** 按钮弹起缩放(峰值) */
private readonly buttonClickScale: number = 1.06;
/** 抽卡(刷新)费用 */
refreshCost: number = 2;
refreshCost: number = FightSet.REFRESH_COST;
/** 卡牌面板展开/收起动画时长(秒) */
cardsPanelMoveDuration: number = 0.2;
@@ -328,6 +329,12 @@ export class MissionCardComp extends CCComp {
this.isBattlePhase = true;
this.enterBattlePhase();
this.clearAllCards();
// 第一次进入战斗阶段关闭guide4
if (!smc.finish_guides.includes(4)) {
smc.finish_guides.push(4);
oops.gui.remove(UIID.Guide4);
}
}
/**
@@ -411,6 +418,11 @@ export class MissionCardComp extends CCComp {
const cards = this.buildSkillDrawCards();
this.dispatchCardsToSkillSlots(cards);
this.playSkillCardEnterAnim();
// 首次弹出技能三选一的时候弹出guide2
if (!smc.finish_guides.includes(2)) {
oops.gui.open(UIID.Guide2);
}
}
private dispatchCardsToSkillSlots(cards: CardConfig[]) {
@@ -427,6 +439,24 @@ export class MissionCardComp extends CCComp {
if (this.skill_card_node && this.skill_card_node.isValid) {
this.skill_card_node.active = false;
}
// 首次完成技能选取后 关闭guide2打开guide3
// 之前这里有个逻辑漏洞:玩家如果在弹出 guide2 之前就已经因为手快点掉了 guide2
// smc.finish_guides 里就会有 2。
// 但其实这里的本意是:只要发生了选取技能,并且 guide3 还没弹过,就弹 guide3。
// 如果我们把它包在 `if (!smc.finish_guides.includes(2))` 里,
// 当玩家点击 guide2 把它关掉时finish_guides 存入了 2
// 再点技能卡触发这个方法,外层 if 就会进不去guide3 就永远弹不出来了!
// 修复:独立判断 guide2 的关闭 和 guide3 的开启
if (!smc.finish_guides.includes(2)) {
smc.finish_guides.push(2);
oops.gui.remove(UIID.Guide2);
}
if (!smc.finish_guides.includes(3)) {
oops.gui.open(UIID.Guide3);
}
}
/** 解除按钮监听,避免节点销毁后回调泄漏 */
@@ -474,6 +504,16 @@ export class MissionCardComp extends CCComp {
const before = this.getAliveHeroCount();
const after = this.getAliveHeroCount();
this.updateHeroNumUI(true, after > before);
// 第一次召唤英雄后关闭guide3打开guide4
if (!smc.finish_guides.includes(3)) {
smc.finish_guides.push(3);
oops.gui.remove(UIID.Guide3);
}
if (!smc.finish_guides.includes(4)) {
oops.gui.open(UIID.Guide4);
}
}
/** 英雄死亡事件回调:刷新面板列表并更新英雄数量 UI */
@@ -603,6 +643,7 @@ export class MissionCardComp extends CCComp {
}
/** 抽卡按钮释放 → 执行抽卡逻辑 */
private onDrawTouchEnd() {
oops.audio.playEffect("music/button");
this.playButtonClickAnim(this.cards_chou, () => this.onClickDraw());
}
/** 抽卡按钮取消 → 恢复缩放 */
@@ -615,6 +656,7 @@ export class MissionCardComp extends CCComp {
this.playButtonPressAnim(this.skill_refresh);
}
private onSkillDrawTouchEnd() {
oops.audio.playEffect("music/button");
this.playButtonClickAnim(this.skill_refresh, () => this.onClickSkillRefresh());
}
private onSkillDrawTouchCancel() {
@@ -625,6 +667,7 @@ export class MissionCardComp extends CCComp {
this.playButtonPressAnim(this.skill_ad_refresh);
}
private onSkillAdDrawTouchEnd() {
oops.audio.playEffect("music/button");
this.playButtonClickAnim(this.skill_ad_refresh, () => this.onClickSkillAdRefresh());
}
private onSkillAdDrawTouchCancel() {

View File

@@ -88,12 +88,6 @@ export class MissionComp extends CCComp {
private maxMonsterCount: number = 80;
/** 怪物数量恢复阈值(降至此值以下恢复刷怪) */
private resumeMonsterCount: number = 45;
/** 新一波金币奖励基础值 */
private prepareBaseCoinReward: number = 10;
/** 每一波金币增长值(公式: base + (wave-1) * growth */
private prepareCoinWaveGrow: number = 4;
/** 金币奖励上限(固定收益,此值不再生效) */
private prepareCoinRewardCap: number = 100;
/** 卡池升级波次配置:达到对应波次时,推送卡池升级事件 */
@property({ type: [CCInteger], tooltip: "卡池升级波次配置,例如 [10, 20] 表示第10波升到2级第20波升到3级" })
cardPoolUpgradeWaves: number[] = [5, 10];
@@ -123,7 +117,7 @@ export class MissionComp extends CCComp {
// ======================== 运行时状态 ========================
/** 战斗已耗时(秒),正向计时 */
/** 本波战斗已耗时(秒),正向计时,用于自适应难度评估 */
clearTime: number = 0
/** 剩余复活次数 */
revive_times: number = 1;
@@ -248,7 +242,7 @@ export class MissionComp extends CCComp {
/** 更新时间/波数显示(仅在秒数变化时更新以减少 Label 操作) */
update_time() {
const remainSecond = Math.floor(this.clearTime);
const remainSecond = Math.floor(smc.vmdata.mission_data.fight_time);
if (remainSecond === this.lastTimeSecond) return;
this.lastTimeSecond = remainSecond;
let m = Math.floor(remainSecond / 60);
@@ -313,6 +307,10 @@ export class MissionComp extends CCComp {
loading.active = false
}, 0.5)
}
// 播放战斗背景音乐,并稍微降低音量
oops.audio.volumeMusic = 0.5;
oops.audio.playerMusicLoop("music/BATTLE");
}
/** 更新开始按钮的状态显示 */
@@ -402,7 +400,7 @@ export class MissionComp extends CCComp {
const label = phaseNode.getComponent(Label);
if (label) {
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}`;
}
// 阶段切换动感表现:只在进入战斗阶段跳动一下,让流程充满心流体验
@@ -642,6 +640,8 @@ export class MissionComp extends CCComp {
if (!smc.mission.play) return;
if (smc.mission.pause) return;
if (this.currentPhase !== MissionPhase.Prepare) return;
oops.audio.playEffect("music/button");
this.to_fight();
}
@@ -802,8 +802,9 @@ export class MissionComp extends CCComp {
if (wave <= 1) return;
if (wave <= this.lastPrepareCoinWave) return;
// 波次金币公式: baseReward + (wave-1) * waveGrow
const waveReward = this.prepareBaseCoinReward + (wave - 1) * this.prepareCoinWaveGrow;
// 波次金币公式: baseReward + (wave-1) * waveGrow,且不超过 prepareMaxCoinReward
const calculatedReward = FightSet.WAVE_COIN_BASE + (wave - 1) * FightSet.WAVE_COIN_GROW;
const waveReward = Math.min(FightSet.WAVE_COIN_MAX, calculatedReward);
const reward = MissionEconomy.executeWaveGold(waveReward);
this.lastPrepareCoinWave = wave;

View File

@@ -70,6 +70,11 @@ export class MissionHomeComp extends CCComp {
/** 启动时显示主页 */
start() {
this.home_active()
// 首次打开游戏打开guide1
if (!smc.finish_guides.includes(1)) {
oops.gui.open(UIID.Guide1);
}
}
onEnable(){
@@ -88,6 +93,13 @@ export class MissionHomeComp extends CCComp {
*/
start_mission() {
mLogger.log(this.debugMode, 'MissionHomeComp', "start_mission")
// 进入战斗后关闭guide1
if (!smc.finish_guides.includes(1)) {
smc.finish_guides.push(1);
oops.gui.remove(UIID.Guide1);
}
oops.gui.open(UIID.Mission)
this.node.active=false;
@@ -144,6 +156,9 @@ export class MissionHomeComp extends CCComp {
this.uodate_data()
this.hideAllPages()
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 { GameEvent } from "../common/config/GameEvent";
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 { MonMoveComp } from "../hero/MonMoveComp";
const { ccclass, property } = _decorator;
@@ -195,6 +195,11 @@ export class MissionMonCompComp extends CCComp {
const monsters = spawningEngine.generateWave(this.currentWave);
this.setupWaveData(monsters);
// 如果处于测试模式,英雄也需要限制为只产出一个,这部分通知可以配合使用
if (TestModeConfig.enable) {
mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] 测试模式已开启每波仅生成1只基准怪物");
}
mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] Starting Wave System");
}
@@ -306,12 +311,16 @@ export class MissionMonCompComp extends CCComp {
let scale = -1;
// 获取硬编码的占位点坐标,不再使用随机偏移
const basePos = MissionMonCompComp.MON_POSITIONS[posIndex];
const basePos = MissionMonCompComp.MON_POSITIONS[posIndex % MissionMonCompComp.MON_POSITIONS.length];
const spawnX = basePos.x;
const landingY = basePos.y + (monData.isBoss ? 6 : 0);
const spawnPos: Vec3 = v3(spawnX, landingY + MissionMonCompComp.MON_DROP_HEIGHT, 0);
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);
// 设置渲染排序

View File

@@ -10,6 +10,37 @@
* GDD: /gdd/rogue-spawning.md
*/
/**
* 玩家战力与经济推演估算 (前 20 波)
* 规则:初始 4 金币,每波递增 1 金币,单波基础收益上限 10 金币。基础英雄 3 金币,刷新 1 金币。
* 合成公式3个 Lv1 = 1个 Lv23个 Lv2 = 1个 Lv3 (满级)。即 1个 Lv3 需要 9 个 Lv1。
* 注:由于抽卡具有随机性,实际需要消耗部分金币刷新,以下推演假设约 20% 金币用于刷新80% 用于购买。
* 6 个坑位满编。
*
* 波次 | 当波收益 | 累计金币 | 累计购卡数 | 预估阵容 (极限最优) | 预估阵容 (脸黑/平滑型) | 阶段说明
* -------------------------------------------------------------------------------------------------------------------------
* W1 | 4 (初始) | 4 | 1 | 1*Lv1 | 1*Lv1 | 初始阶段
* W2 | 5 | 9 | 2 | 2*Lv1 | 2*Lv1 | 积累英雄
* W3 | 6 | 15 | 4 | 1*Lv2 + 1*Lv1 | 4*Lv1 | 开始成型
* W4 | 7 | 22 | 6 | 2*Lv2 | 6*Lv1 | 刚好满编(6坑位)
* W5 | 8 | 30 | 8 | 2*Lv2 + 2*Lv1 | 1*Lv2 + 5*Lv1 | 升阶开启
* W6 | 9 | 39 | 10 | 1*Lv3 + 1*Lv1 | 2*Lv2 + 4*Lv1 | 首个满级核心出现
* W7 | 10 | 49 | 13 | 1*Lv3 + 1*Lv2 | 3*Lv2 + 3*Lv1 | 阵型强化
* W8 | 10(Max) | 59 | 15 | 1*Lv3 + 2*Lv2 | 4*Lv2 + 2*Lv1 |
* W9 | 10 | 69 | 18 | 2*Lv3 | 6*Lv2 | 全员至少 Lv2
* W10 | 10 | 79 | 21 | 2*Lv3 + 1*Lv2 | 1*Lv3 + 4*Lv2 + 1*Lv1 | (脸黑型开始超出6怪自然合成)
* W11 | 10 | 89 | 23 | 2*Lv3 + 1*Lv2 + 1*Lv1 | 1*Lv3 + 5*Lv2 |
* W12 | 10 | 99 | 26 | 2*Lv3 + 2*Lv2 + 1*Lv1 | 2*Lv3 + 2*Lv2 + 1*Lv1 | 双核心阵型确立
* W13 | 10 | 109 | 29 | 3*Lv3 + 1*Lv1 | 2*Lv3 + 3*Lv2 + 1*Lv1 |
* W14 | 10 | 119 | 31 | 3*Lv3 + 1*Lv2 + 1*Lv1 | 2*Lv3 + 4*Lv2 |
* W15 | 10 | 129 | 34 | 3*Lv3 + 2*Lv2 + 1*Lv1 | 3*Lv3 + 2*Lv2 | 游戏后期,半数满级
* W16 | 10 | 139 | 37 | 4*Lv3 + 1*Lv1 | 3*Lv3 + 3*Lv2 |
* W17 | 10 | 149 | 39 | 4*Lv3 + 1*Lv2 | 4*Lv3 + 1*Lv2 |
* W18 | 10 | 159 | 42 | 4*Lv3 + 2*Lv2 | 4*Lv3 + 1*Lv2 + 1*Lv1 |
* W19 | 10 | 169 | 45 | 5*Lv3 | 5*Lv3 |
* W20 | 10 | 179 | 47 | 5*Lv3 + 1*Lv1 | 5*Lv3 + 1*Lv1 | 大成阵型,接近全员满级
*/
// ======================== 怪物类型枚举 ========================
/** 怪物类型8 种) */
@@ -247,16 +278,26 @@ const BOSS_TIERS = new Set([1, 2, 3, 4, 5])
const MAJOR_BOSS_TIERS = new Set([3, 5])
/**
* 5 阶梯配置表
* key = 阶梯编号 1-5value = 该阶梯的完整配置
* 主线 15 波映射wave 1-3 → T1, wave 4-6 → T2, ..., wave 13-15 → T5
* 5 阶梯配置表 (基于"第5波单怪=1个英雄"的基准推演)
*
* 核心设计推演:
* 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> = {
1: { multiplier: 1.0, budget: 200, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false },
2: { multiplier: 2.0, budget: 500, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true },
3: { multiplier: 3.5, budget: 1100, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true },
4: { multiplier: 5.5, budget: 2000, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
5: { multiplier: 8.5, budget: 3200, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
// T1(W1-W3): 预计累计 2.3 卡。目标总难度 101。Budget 80 * 1.1 = 88
1: { multiplier: 1.1, budget: 80, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false },
// T2(W4-W6): 预计累计 8.0 卡。目标总难度 352。Budget 160 * 2.0 = 320
2: { multiplier: 2.0, budget: 160, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], 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 },
}
/**
@@ -362,14 +403,14 @@ export interface BlueprintTemplate {
*/
export const BlueprintTemplates: BlueprintTemplate[] = [
{ id: "R1", type: TemplateType.REST, tierMin: 1, allowAffix: false,
slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 3, weight: 1.0 }] },
slots: [{ typePool: [MonType.Melee], countMin: 1, countMax: 2, weight: 1.0 }] },
{ id: "R2", type: TemplateType.REST, tierMin: 2, allowAffix: false,
slots: [{ typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 1.0 }] },
{ id: "R3", type: TemplateType.REST, tierMin: 3, allowAffix: false,
slots: [{ typePool: [MonType.Melee, MonType.Long], countMin: 3, countMax: 5, weight: 1.0 }] },
{ id: "N1", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false,
slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 3, weight: 1.0 }] },
slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 4, weight: 1.0 }] },
{ id: "N2", type: TemplateType.NORMAL, tierMin: 1, allowAffix: true,
slots: [
{ typePool: [MonType.Melee], countMin: 1, countMax: 3, weight: 0.6 },
@@ -378,13 +419,13 @@ export const BlueprintTemplates: BlueprintTemplate[] = [
{ id: "N3", type: TemplateType.NORMAL, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 0.5 },
{ typePool: [MonType.Long], countMin: 1, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Long], countMin: 1, countMax: 2, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.2 },
] },
{ id: "N4", type: TemplateType.NORMAL, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.4 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3 },
] },
@@ -396,26 +437,26 @@ export const BlueprintTemplates: BlueprintTemplate[] = [
] },
{ id: "M2", type: TemplateType.MIXED, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.3 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 4, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.4 },
] },
{ id: "M3", type: TemplateType.MIXED, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 6, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.3 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Summoner], countMin: 1, countMax: 2, weight: 0.2 },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.2 },
] },
{ id: "E1", type: TemplateType.ELITE, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.Heavy], countMin: 1, countMax: 3, weight: 0.5, forceAffix: true },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 1, countMax: 3, weight: 0.5, forceAffix: true },
{ typePool: [MonType.Heavy], countMin: 1, countMax: 2, weight: 0.5, forceAffix: true },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 1, countMax: 2, weight: 0.5, forceAffix: true },
] },
{ id: "E2", type: TemplateType.ELITE, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.Heavy], countMin: 1, countMax: 3, weight: 0.3, forceAffix: true },
{ typePool: [MonType.Heavy], countMin: 1, countMax: 2, weight: 0.3, forceAffix: true },
{ typePool: [MonType.Assassin], countMin: 2, countMax: 3, weight: 0.4, forceAffix: true },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3, forceAffix: true },
] },
@@ -430,24 +471,24 @@ export const BlueprintTemplates: BlueprintTemplate[] = [
{ id: "B2", type: TemplateType.BOSS, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.5 },
{ typePool: [MonType.Long, MonType.Support], countMin: 1, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 0.5 },
{ typePool: [MonType.Long, MonType.Support], countMin: 1, countMax: 2, weight: 0.3 },
{ typePool: [MonType.Assassin], countMin: 1, countMax: 2, weight: 0.2 },
] },
{ id: "B3", type: TemplateType.BOSS, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss, MonType.LongBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.35 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 4, weight: 0.35 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 2, countMax: 4, weight: 0.35 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 2, countMax: 3, weight: 0.35 },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3 },
] },
{ id: "B4", type: TemplateType.BOSS, tierMin: 4, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss, MonType.LongBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Heavy], countMin: 2, countMax: 4, weight: 0.35 },
{ typePool: [MonType.Heavy], countMin: 2, countMax: 3, weight: 0.35 },
{ typePool: [MonType.Assassin], countMin: 2, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Summoner, MonType.Support], countMin: 1, countMax: 3, weight: 0.2 },
{ typePool: [MonType.Melee], countMin: 2, countMax: 4, weight: 0.15 },
{ typePool: [MonType.Summoner, MonType.Support], countMin: 1, countMax: 2, weight: 0.2 },
{ typePool: [MonType.Melee], countMin: 1, countMax: 3, weight: 0.15 },
] },
{ id: "TUTORIAL", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false,
@@ -494,6 +535,42 @@ export const InfiniteModeConfig = {
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,
}
// ======================== 向后兼容接口 ========================
/**
@@ -543,6 +620,15 @@ export interface GeneratedMonster {
affixes: AffixType[]
isBoss: boolean
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 }[];
}
}
// ======================== 生成引擎 ========================
@@ -604,6 +690,42 @@ export class RogueSpawningEngine {
generateWave(waveNumber: number): GeneratedMonster[] {
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 waveInTier = ((waveNumber - 1) % 3) + 1 // 1, 2, or 3

View File

@@ -117,6 +117,7 @@ export class SkillBoxComp extends CCComp {
private onNodeClicked() {
if (!this.initialized) return;
oops.audio.playEffect("music/button");
// 点击时弹出 HInfoComp传入卡牌 UUID 和等级以启用预览模式
const config = CardPoolList.find(c => c.uuid === this.s_uuid || c.skill === 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 sCrt = (config.crt ?? 0)+(SUp.crt*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 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.critical] = cAttrsComp.getRuntimeCritical() + sCrt;
sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getRuntimeCritDamageBonus();
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_distance] = cAttrsComp.knockback_distance || 0;
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getRuntimePunctureChance(); // 初始化携带施法者的穿透概率